飞将军

飞将军 查看完整档案

深圳编辑华东交通大学  |  软件工程 编辑腾讯公司  |  前端开发工程师 编辑 www.jianshu.com/u/6120846f258d 编辑
编辑

尽可能努力是成功的唯一途径!

个人动态

飞将军 赞了文章 · 2017-07-10

熊写代码这三年:阅读写作与技术成长

本文是非技术向的随笔,慎点!
熊写代码这三年:阅读写作与技术成长 从属于 程序熊的自我修养系列。临近毕业,随手写了篇随笔,聊以纪念我过去研究生三年间的技术之路,感谢陪伴我这三年的家人,感谢所有陪我一起打拼过的战友,感谢所有阅读过我文章的陌生人。

本文是一篇种田流水文,希望以平淡的笔触记录笔者这三年的成长。本文整体大概会包括自我定位、阅读、写作、知识殿堂这几个部分,为了避免过于正式就不分章节了。

笔者的第一份工作从大三开始,在南京某家安全公司从事安全培训与渗透平台开发,兼职做做讲师;老实说肚子里没几滴墨水却要对着台下数百听众,搜肠刮肚地忽悠他们,很锻炼面皮啊。后来某个来头不小的二代找我说一起创业吧,他想颠覆世界,问我敢不敢一起。于是我就拉着身边的兄弟走了出来,很感谢我的两个舍友那些年里给我的支持与包容,容忍了我做的那些傻逼的事情。现在想起来,我还挺佩服 CEO 勇气的,竟敢找我来创业,真的是年轻啊。那个时候经常逛的是以 DZone 为代表的这类网站,并非说它们不好,不过确实太多的标题党,动辄新一代产品或者性能提升 100%。那时的我太过年轻,才从农村出来尚不知城市套路深,轻信了这些标题党,当然根本原因还是我们毫无经验,结果两个月的时间开发出来的 Hybrid APP 启动时间 20 多秒;当时我还一脸无法理解为什么 CEO 会露出绝望的眼神,毕竟之前参加某软件大赛的作品启动要将近两分钟还得到了好评。经历了技术波折之后我们老老实实回到了原生开发,接下来的一年多时间我技术上不一定成长多少,市面却是见了不少,充分认识到关系不是万能的、产品经理是必须的、需求是不能随便变的、领导的话是不能轻易相信的等等等等。后来,公司黄了,一分钱没赚到。后来,我参与到其他的创业当中,满怀热情,也看着那些年的冬日里熄灭的火苗。次数多了,也就不会痛了,印象比较深刻地还参与过某在线婚庆创业,某 3D 打印创业等等,直至现在有时候会去妹子所在的某建筑行业软件服务公司帮帮忙。如今公司招人,我引以为豪地能拿出来讲夸公司的一大优点就是,我们公司有稳定收入,不会吃了上顿没下顿,不会一朝入冬。想想走过的路,有两个自己打自己脸啪啪响的典型,一个是大二的时候推崇底层开发,裸写机器码,觉得 Web 不过是套模板的毫无前途的活计;另一个是跟运营商接触多了觉得传统软件行业里都是观念陈旧的老技术、毫无创新理念与创新动力。然后我现在主要依托于 Web 技术栈,在于政府合作的建筑投标软件行业里混饭吃。这三年走过大江南北,到过万里之外,见过异域风情,写过数百万字,赚到数十万元。印象最深的是爱人相伴,友人相随,笑过哭过,也有后悔。

笔者啰啰嗦嗦这么多,想表述的不过是认识你自己。天地不仁,万物刍狗,我们要相信勤奋是会有回报的;念念不忘,必有回响,连机器都能通过大量学习优化模型,何况智人乎?笔者是早产儿,七个月的时候出生,差一点就不能跟这个世界说你好。从小略显愚笨,弱于常人,就像笔者对于数学心有畏惧,这么些年一直没学好算法结构与机器学习。笔者也没有过人的毅力与执着的态度,到现在也没能真正的好好锻炼过,也没能如预期般学完一个课程或者看完一本书。更多的时候我是想着怎么跟自己妥协,寻找到真正能够完成的,精神与肉体上都能接受的方案。另外在将技术相关的东西之前,笔者还是希望读者能认清自己的定位,不是说一定要怀着莫大的热情才能进入 IT 领域,而是尽可能地找到自己的定位。我觉得很好的例子就是我夫人,当年也是在某外包公司做嵌入式码农,每天工作都是痛苦万分;后来慢慢地摸索,发掘了她某个最大的优势:以轻微的强迫症去做产品经理,女生特有的细心与品质决定了她能更好地去催促程序员赶进度。现在她同时实现了自我价值与集体价值,成为了公司运转的核心之一。知前路之漫漫,敢披荆而斩棘,相信大家都能找到合适自己的位置。

化学中的放射性元素往往有所谓半衰期的概念,即某种特定物质的浓度经过某种反应降低到剩下初始时一半所消耗的时间。同理,知识的半衰期则是用于衡量知识的价值随着时间流逝它消失的速度。相对变更较慢的医学知识的半衰期约45年,物理学知识的半衰期是10年,而计算机知识的半衰期可能只有两年,一直在激烈变化的互联网领域知识可能只有几个月。沉舟侧畔千帆过,就像笔者在怀着被抛弃的恐惧在奋斗中前行描述的,鱼与熊掌不可兼得,放弃安逸的铁饭碗而进入竞争激烈的 IT 行业,势必会被后来者超越的,我们只有不断修修打打自己,才能不被这个时代所抛弃。古语有云,开卷有益,对于笔者的阅读相关可以参考某熊的阅读与写作日常 ,这里不作赘述。不过回望自己的阅读流程,我最初是从刷推酷的每日推荐开始,大概每天能看数百篇,选出有价值的放到 Pocket 里面留待后看。后来慢慢的发现每天刷的列表里面仅有两三篇会被留存下来,慢慢的就转向了 Reddit、HackerNews、Medium 这些;老实说笔者并非崇洋媚外,不过目前来看中国的社区相对整个世界还是一汪浅水,所以我默默地把公司默认搜索引擎设置成了 Google。在成长之初碎片化的阅读很有益处,虽然会感觉很痛苦,仿佛被强行填食的鸭子,但是如破茧而出,帮你打开广阔的世界。笔者现在逐步的有强迫自己去看书,虽然有时候跟看文章一样一目十行,蜻蜓点水,但是不得不承认书和论文里成体系的描述介绍不是碎片化的文章所能给予的。这里推荐笔者前一阵子收集的追求技术之上的进阶阅读学习索引机器学习、深度学习与自然语言处理领域推荐的书籍列表

文以载道,歌以咏志。当我们阅读积累到了,自然就会形成自己的想法,并且想对这个世界说出来。笔者的写作分为两步,首先是做笔记,而后是写文章,厚积薄发,切不能强求。笔者最初做笔记的时候,很多朋友会质疑,记录的笔记真的会去看吗?是不是记录之后就能记住了?答案自然是否定的,笔者一直以来鼓励自己做笔记的动力并不是让自己不会遗忘,而是希望在下一次需要的时候能够以最快的速度学习让自己回忆起之前的东西。笔者发现身边很多人的学习能力并不弱,但是技术能力难以进步突破的问题却是在于永远都在重复学习,譬如笔者团队中秉持岗位轮换的原则,可能做几个月的服务端再轮换做一些简单的前端,但是每次都需要重新学习,看不出什么进步。罗曼罗兰说过,多数人二十或三十多岁已经死了,他们变成自己的影子,不断重复以前的自己。有时候我们的笔记会是我们生命存在的痕迹,让你能够记得自己走过的路,踩过的坑。笔者现在大概分门别类地有两千多篇笔记,断断续续地写了二百多篇文章;并不是说没有积累就不能写作,而是你没有积累很难去进行长时间的持续地写作。写文章本身不仅是让你的思想曝光于世,让别人帮你发现自己的不足;还是很好的打造个人品牌,增加自己社区影响力的好方法。

如果你是前端新人或者技术新人,很建议从尝试翻译开始;InfoQ 网站包括其架构师月刊等一直是我认为国内质量比较高的资讯来源之一,年后也有幸成为了其社区编辑。我发现他们有个很不错的任务领取与报酬机制,如果你希望相互督促,也能转点零花钱,那么可以尝试加入这个大社区,跟着大家一起前行。

记得包法利夫人里面有一句总结,浅薄且不甘平庸是最大的原罪;而在技术之路上,在没有知识体系的情况下,学习的知识都是相互独立,难以互相借鉴,举一反三,阅读也不过是春风拂面,一掠而过,不留痕迹,知识也就难以真正的沉淀下来。笔者非常支持认可碎片化学习的思想,但是否定在没有知识体系的情况下盲目的碎片化学习。特别是对于尚未建立基础知识体系与认知能力的同学,如果突发性地吸收过多的知识,反而会摧毁自己的认知能力。就好像传说中的吸星大法,乱吸的后果就是体内真气斑驳不堪,最终走火入魔,爆体而亡。因此我们必须要建立自己的知识体系与思维宫殿,梭罗在《瓦尔登湖》中写道:知道自己知道什么,也知道自己不知道什么,这就是真正的知识。知我所知是对于自己能力的正确认识,知我所不知则能为自己未来的路明确些方向。笔者关于自己的对于软件世界的认知写在了2016-我的技术之路:编程知识体系结构图里。Program into Your Language, Not in It.

前端工程化这个词一直很火,笔者在 2016-我的前端之路:工具化与工程化2015-我的前端之路:数据流驱动的界面 这两篇年度总结里都有详细的不成熟的自我思想的介绍。记得面试腾讯的时候面试官问道你这么激进地使用现代语法,使用 Babel 然后导致包体增倍怎么能兼顾老旧浏览器或者带宽上不是很好的地方的用户呢?我默默想起了现在公司碰到的一个有趣的事件,我们做的某个投标工具(Web & Electron)对于浏览器或者系统有较高要求,但是政府客户典型的标配 XP 与 IE。我们思考了好久如何去达成兼容性,最后欧了一波笔记本电脑跟软件产品打包发售,还额外赚了一笔的说。工程做久了,有时候会发现自己陷入到某种瓶颈。本节可能过于主观了,对于我们所熟知的云计算与大数据、服务端应用程序架构(API、微服务与高可用等)、基础架构(数据存储、虚拟化、分布式系统与集群计算等)等等偏工程的进阶之路,老实说并不是螺丝钉们所能轻易实践的。笔者之前一直感慨于混迹在小公司之间,所谓大数据不过镜花水月,很难真正有实践的场景。除了工程向的进阶之外,笔者个人主观感觉还有两个偏理论的进阶向,即使不能有所实际成就也能提升个人品味的方向,一个是偏向于数据学科与人工智能,包括机器学习、深度学习、自然语言处理等等;另一个是偏向编程语言原理、计算机系统基础理论、数据库系统基础理论的方向。笔者本科的时候发了四五篇文章,遗憾的是在南大的三年未能投身学术,一文未发,愧对师长。有时候看着其他同学仰望星空,自己只能默默在沼泽地里蹒跚前行。

本文最后,笔者还是想对于所有阅读过我的文章的朋友说声谢谢,你们的支持是我前行的动力,希望在未来的岁月里我能够继续完善我的知识体系中的内容,也希望能够帮助到所有花时间阅读我文章的人。诚如罗胖所说,未来的世界是时间的战场,愿意花时间阅读的朋友本身也是一种付出。笔者这些年来一直笔耕不缀,不过写的绝大部分都是属于某个领域中某个技术细节的介绍与实践总结,借这篇随笔之际,笔者也是打算以随笔的方式,描述自己对于编程的认知、感悟、猜想,因为这个系列更多的是非技术性的思考,希望能得到真正的大家指导,与其他人思维碰撞。笔者不敢取名为程序员的自我修养,毕竟笔者自己都不知道自己是否称得上合格的程序员,因此取名为程序熊的自我修养。【程序熊的自我修养】系列拟会包含以下部分:

  • 【程序熊的自我修养】知识体系与自我定位

  • 【程序熊的自我修养】阅读与积累

  • 【程序熊的自我修养】工具与实战

  • 【程序熊的自我修养】产品与工程化

  • 【程序熊的自我修养】编程之道:编程语言、数据结构与算法、编程范式

  • 【程序熊的自我修养】Web 前端

  • 【程序熊的自我修养】服务端应用程序架构

  • 【程序熊的自我修养】数据科学与人工智能

查看原文

赞 7 收藏 6 评论 0

飞将军 关注了用户 · 2017-07-10

王下邀月熊_Chevalier @wx_chevalier

爱代码 爱生活 希望成为全栈整合师
微信公众号:某熊的技术之路

关注 3437

飞将军 回答了问题 · 2017-05-25

Node学习记录: koa

推荐研究下阿里的egg框架, 基于koa, 但远远超过了koa

egg

关注 3 回答 3

飞将军 回答了问题 · 2017-05-25

https重定向的问题?

性价比最高的是使用nginx的rewrite来配置

关注 4 回答 3

飞将军 关注了用户 · 2017-03-17

lakb248 @kk_470661

Shopee(虾皮)深圳研发中心找前端/后端/移动开发,内推请投 lakb248@163.com

关注 128

飞将军 赞了文章 · 2016-06-17

【入门篇】react-native

前言

这里以编写react-native android应用程序作为例子来讲解(为毛不用IOS?因为没有mac,也不想装黑苹果)

搭建基础环境

JDK(必须,不解释)
SDK(建议使用Android Studio,集成SDK以及模拟器)
genymotion(如果是使用真机或者Android Studio自带的模拟器,可以选择不装)
NVM(node版本控制器,需要node4.0以上版本)

以上配置不是必须,可自行选择适合自己的环境,部分安装过程可能会涉及到翻墙,需要配置代理

踩坑记录

genymotion

这里选择genymotion模拟器来讲解,也会提一下Android Studio自带的模拟器的一些注意点,使用真机的朋友可跳过这段。
genymotion的安装有2种模式,一种是带有Oracle VM VirtualBox虚拟机,另外一种是纯净版,genymotion的运行依赖VirtualBox虚拟机。

选择下载android6.0-API 23模拟器
此处输入图片的描述

如果无法显示API列表,请配置代理Settings->NetWork->Use HTTP Proxy

启动模拟器,可能会有部分人卡在android启动界面上面,无法进入
此处输入图片的描述
genymotion的运行基于X86的架构,比起arm,X86的性能更流畅。我们需要使用X86架构的话,还需要安装HAXM。

1、打开SDK Manager->Extras->Intel x86 Emulator Accelerator,安装即可,如果没有任何东西显示,还是代理问题,Tools->Options->Proxy Settings
2、进入C:\Users\用户\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager
安装intelhaxm-android.exe,安装出错,请参考这里

至此我们就能进入模拟器界面

Android Studio

如果想使用android studio自带模拟器,可以打开AVD Manager->Create Virtual Device->选择自己需要的android版本
值得注意的是,模拟器默认选择X86架构,如果你不喜欢,你需要自己手动改成arm架构
此处输入图片的描述

NVM

这里选择用NVM来控制node版本,如果你已经装过node4.0以上的版本,就跳过这里。
安装方式和使用文档,github上面讲的很清楚,这里说下代理的配置,其实也就是npm的代理,配置全局代理

npm config set proxy=you proxy
npm config set https-proxy=you https proxy

React-native初始化

心理默默祈祷以下命令千万不要错误。。。

npm install -g react-native-cli
react-native init AwesomeProject
cd AwesomeProject
react-native start
react-native run-android

果然。。。好吧,这里分享下自己遇到的一些问题

npm install -g react-native-cli:出错的最大可能就是node版本低于4.0或者代理没配置成功
react-native run-android:这个命令会下载gradle依赖,执行失败的原因大部分也是因为代理的问题
进入C:\Users\用户\AppData\.gradle,打开gradle.properties(不存在就新建一个),修改

systemProp.https.proxyHost=You https proxy
systemProp.https.proxyPort=You https proxyPort
systemProp.http.proxyHost=You proxy
systemProp.http.proxyPort=You proxyPort

总算是把android应用程序跑起来了,真累人啊
此处输入图片的描述

总结

先发一篇react-native起步的文章,之后会进行一些实际的案例开发,文章内容如果有哪些不对的地方,欢迎指出。

参考文档

http://wiki.jikexueyuan.com/project/react-native/GettingStarted.html
https://facebook.github.io/react-native/docs/getting-started.html

查看原文

赞 2 收藏 24 评论 5

飞将军 赞了回答 · 2016-03-20

解决AngularJS操作ng-show指令

<ul ng-controller="listCtrl">
    <li ng-repeat="item in items" ng-click="delete()" ng-show="item.show">
        <span ng-bind="item.title"></span>
        <span ng-bind="item.price"></span>
    </li>
</ul>
<script>
    var myApp = angular.module('myApp',[]);
    myApp.controller('listCtrl',function($scope){
        var items = [{title:"title1",price:120},{title:"title2",price:23},{title:"title3",price:32234}]
        $scope.items = items;
        // $scope.show = "true";
        $scope.delete = function(item){
            $scope.item.show = "false"
        }
    })
</script> 

关注 3 回答 3

飞将军 关注了问题 · 2016-03-20

解决关于JavaScript中的闭包的疑问

一.到底什么是闭包?

是只要是函数嵌套函数,不管是被嵌套函数是否引用了外部函数的局部变量就是闭包,还是内部函数必须return出去之后才形成闭包?

1.第一个例子


 // #1
 function outer(a,b){
    var c = 999;
    
    function inner(){
     
       console.log(a,b,c);
    
    }
    
    inner(); // 直接调用了内部函数,并没有return出去,这是闭包么?
    
 }

/*----------------------分割线----------------------------*/

 // #2
 function outer(a,b){
    var c = 999;
    
    // 这种情况下,inner没有引用外部outer的变量
    function inner(){
       var d = 2;
       var e = 3;
       console.log(d+e);
    
    }
    
    inner(); // 直接调用了内部函数,并没有return出去,这是闭包么?
    
 }


/*----------------------分割线----------------------------*/

 // #3
 function outer(a,b){
    var c = 999;
    
    // 这种情况下,传入的str如果是变量名的话,就会引用outer内的变量
    function inner(str){
       console.log(eval(str));
    }
    
    return inner; 
    
 }
 var inner = outer(1,2);
 inner("a"); // 1
 inner("b"); // 2
 inner("c"); // 999

如果只要是函数嵌套函数就是闭包的话,那么如果没有return inner出去的话,也就不会出现在外面引用outer函数的局部变量了(#2),那么outer函数执行过后,即使outer内部的局部变量存在于内存中,也没有程序会访问到了,那么,GC会销毁outer内部的局部变量么?但是#3这种情况下,inner虽然没有显式地调用outer的局部函数,但是存在这种可能性,例如inner("a") 会访问outer的局部函数a,那么显然这种情况下,GC肯定不会销毁outer。。

哎呀,反正是很迷惑,请各位大牛给个醍醐灌顶的感觉吧???

2.第二个例子


 function outer(a,b){
    var c = 999;
    
    function inner(){
     
       console.log(a,b,c);
    
    }
    
    return inner; // 把内部函数return出去,就形成了闭包,这点儿我肯定
    
 }

二.使用闭包有什么好处?是怎么造成内存泄漏的?

关注 8 回答 3

飞将军 回答了问题 · 2016-03-19

解决关于setTimeout()函数

for循环瞬间就执行完了,此时10个定时器函数都被加到了事件队列中,第一个等待1秒执行了,此时第二个定时器也已经过了一秒,再过1s就执行第二个了,以此类推。

题主想实现递增执行的话,可以通过将所有的任务加入数组,然后通过reduce函数来实现!

关注 20 回答 8

认证与成就

  • 获得 2 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2014-04-24
个人主页被 247 人浏览