程序员的自我修养
陈逸鹤-技匠
第一章 谈职业生涯
码农、程序猿、软件工程师、张江男、屌丝程序员。
我更愿意用技匠这个词来形容程序员,就像我给自己起的花名一样。程序员应该是那些不断追求更高技术,并有着自己产品梦的工匠。
漫画描述1:一个普通人每天都很努力,他头顶上显示的能力槽也在慢慢地增长。而图中的另一个天才,则整天不务正业,当然他头上的能力槽也几乎没有增长。
漫画描述2:经过了长时间的努力,普通人头顶上的能力槽慢慢接近了满格,此时那个天才醒悟并开始了努力。
漫画描述3:又过了一段时间,普通人头顶上的能力槽终于满格了,但此时天才头顶上的能力槽却早已爆表,高出了那个普通人很大一截,那个努力的普通人只好无奈地抬头仰望着那位天才。
漫画描述4:但当普通人默默回过头来,却惊讶地发现有更多的人正同样充满敬意地仰望着他,因为此时的他也早已成为了大多数人眼中的那个佼佼者。
我经常听到一些程序员抱怨自己的职业生涯毫无起色,或者在工作了几年之后就担忧自己遇到了瓶颈。
好奇心可能是那些优秀程序员与普通程序员之间最显著的区别之一。
紧盯着电脑屏幕,不断敲击键盘,目光有些呆滞。
我很支持那些年轻的程序员们坚持去走技术路线,但这不应该成为你排斥与人沟通的理由。
环境对一个人的影响是巨大的,而最可怕的是当你身处其中时,很难意识到你正在变得越来越糟。
充足的睡眠往往能使你更有效率地投入到新一天的工作中,你也会变得更有创造力。
旅行:去任何一个新的地方都可以称之为旅行,旅行不是为了放松,因为你需要坐飞机、开车、走路,这些都会使你产生压力,但你仍需要去旅行,因为这能让你发现和感受新的东西,而这些是从电脑屏幕上无法获得。
如果上面提到的其他建议都对你无效的话,那么就请坚持第2点建议吧“比一般人更加努力”,因为它将成为你最大的竞争优势。
二、那些程序员们后知后觉的职涯经验
你的薪酬与工作量无关。
我的建议是尽可能持续做一件事。这既是指技术上的积累,也是指你能完整或较长时间参与同一个项目或开发一个产品。
我当然会鼓励他们去学习更多不同的东西,但同时我也会提醒他们,技术深度及完整项目经验的重要性,如果你总是在跟随那些新出现的技术和框架,那你很难在某一项技术上达到理想的深度;同样,在一个公司里,如果你总是在更换项目,那你也很难提升自己的价值。参与10个项目,不如完整参与一个项目。
蜻蜓点水,浅尝辄止。
在这十几年的工作时间里,我唯一看到不变的恰恰是变化本身。
要成为一个领域的专家一定要花费10000小时以上的时间,而对于程序员来说,所谓的100小时定律同样重 要——花100小时学习或修炼一门新的技术,往往就能超过一般人很多。
声誉对于一名程序员来说非常重要。
而这样做的结果往往适得其反,用户并不认可我对系统的设计,我也时常被要求返工,这使得我的工作效率变得很低,心情也因此一度非常低落。
改变源于我对沟通意义的重新认识。
比如,编写文档或做PPT的能力、演讲的能力、说服他人的能力,等等。
因为,这些技能总是在你看不见的地方互相作用和促进的。
程序员的能力来自于大量的编码实践,以及持续学习的能力和勤于思考的习惯。
坚信那些你所坚信的东西,你会变得越来越好。
三、如何招到一名靠谱的程序员
阅读简历永远是面试的第一步。好的简历一定是正确、清晰并且能够体现候选人最有价值一面的。
面向对象的3个基本特性:继承、封装、多态。
我们很严肃地看待我们自己关于招聘。
流程的哲学。我们希望每一个GitHub员工都了解他们所要面对的环境,并保证他们是能够很好适应的。这包括我们所创造的文化、哲学、计划、错误甚至是晚餐。比起他们的技能是否满足要求,我们更看重他们的潜力,以及是否能够适应我们的企业文化。
你的目标不应该是简单地获得一份工作或者雇佣某个人,而应该以获得更多的工作乐趣和建立更良好的工作关系为目的去看待招聘这件事,切忌不要急于求成,就像谈恋爱一样,当双方都有感觉时,一切就水到渠成了。
四、每个程序员都应该了解的一件事
其实在我看来,他们所谓的这些秘籍,都可以归纳为一种能力,那就是自我营销。
自我营销往往能够有效地放大你所做的努力,并且在你成功的道路上起到催化剂的作用。
我尤其鼓励大家去读那些与技术无关的书籍。
你可以读任何历史、经济、人文、艺术类的书籍,它们都能够帮助你丰富自己的知识和思想,使你变得更加全面和完善,而这反过来,又能帮助你建立信心。
而且,对大多数程序员来说,给机器写代码要比给人写文档容易得多。
可以说,文档质量的高低是衡量一名程序员是否优秀的重要标准之一。
其实,我们可以通过寻找一些优秀的文档示例来学习如何制作优秀的文档,这其实并不困难。知道什么是优秀的,然后像写你的代码一样用心去制作就行了。
一个完全封闭的程序员一定不是一个优秀的程序员。
马云和乔布斯都有一个共同点,那就是他们很早就掌握了自我营销的能力。
五、程序员的烦恼
我曾非常肯定地告诉他们,应该坚持留在一线城市,因为这里有最好的资源,无论是硬件还是软件方面,一线城市都汇聚了最优秀的基础设施和人才。
还有一点不得不提的是,一旦离开,你将很难再回来,因为在很多HR看来,这种没有延续性的工作状态,代表了不稳定,以及潜在的能力风险。
就像他反问我的,如果结果是这样,他的一生为了房子而做的努力是否真的值得呢?
甚至我们还看到了社会上出现的隐性阶级:有房阶级与无房阶级。
买房本身并不会给你带来持久的快乐,因为当你买完房后,你会欠一大笔债,需要用几十年才能还清;当你终于把欠款还清时,你又会觉得这套房子太小,已经不够一家人住,需要换一套更大的房子。你不会得到快乐,因为这些客观条件(钱财、房子)总是无法与你的主观期望相符。相反地,如果买房能够给你的家庭带来更稳定的生活,为孩子提供更好的成长环境,而这一切都能为你的生活赋予意义,并让你感到更加快乐的话,那你还是应该更坚定地留下,而非选择离开。
虽然大部分程序员都会向往BAT这样的大型软件公司,但我想说,公司就像是围城,外面的人拼了命想进去,而在里面的人却都想逃出来。几乎所有公司的员工都会抱怨自己的工作是多么无聊(可能Google除外),而只有正确的心态才是解决之道。
杂事不杂。
而更重要的是,如果不是出于兴趣的话,你也很难学好编程。
对于每个人来说睡眠都非常重要,通过牺牲睡眠来获得一两个小时的时间,到头来只会是恶性循环,得不偿失。
程序员和普通人一样也会在工作和生活中遇到各种不同的问题,有一些是因为他们尚未成熟,没有达到宏远的眼界和豁达的胸襟,而另一些则多是闲愁,因不够充实而平添烦恼。
六、提给年轻程序员的职涯建议
这其中,一定存在运气等其他客观因素的影响,但仔细观察,我们会发现那些成功的人,往往是那些有着坚定目标,并持续努力的人。
小野二郎。
数寄屋桥次郎。
我想他一定会认为甲是一个好员工,但乙员工的潜力更大,值得花更大的力气去培养。
国外有一个词,叫作PKSS(PK Saturday and Sunday),也就是说在周六和周日进行比拼。
爱因斯坦也曾说过:人的差别在于业余时间。
我的建议是既要“专”,又要“博”。
知识往往是相通的,你学得越多便学得越快。
那么如何才能提高自己的情绪控制能力呢?一个简单的方法就是做到对事不对人。
可见周围的人是否足够优秀,成了他选择企业的一个重要因素。
我在Stackoverflow上查找开发问题,我用GitHub管理代码库并和来自世界其他国家的程序员一起维护开源项目。我也在Dribbble上浏览优秀的UI设计作品以获得设计灵感,我还在Freelancer上,做一些感兴趣的兼职项目。英语使我开阔了视野,从一个国家的人,成为了一个世界的人。
当然,你应该出去旅行,因为你需要去发现新的东西,而不是因为你需要放松。
第二章 谈实践与认知
随着技术的进步和专业领域的融合,程序员的职能正在不断扩展,你一定也听到过DevOps、全栈工程师、增长黑客这些词吧,新一代的程序员不仅需要具备很强的编程能力,同时还需要具备从设计、运营、测试等各种不同角度去进行分析和判断的能力。
是啊,解决问题的关键,往往不是如何通过技术手段禁止用户这样做,而是理解用户这样操作的原因,从而从根本上找出解决的办法。
二、全栈工程师如何快速构建一个Web应用
网站定位、功能设定、设计、架构、开发、部署、性能调优、数据统计、开发工具。
没有最好的架构,只有最合适的架构。
亚马逊云。
你只需要在百度统计中注册一个账号并加入你的站点,然后在你的网站头部加入一小段JavaScript代码就能实现最基础的。
网站统计功能了。
能够快速构建出一个Web应用或APP是全栈工程师的核心竞争力,这也是为什么那么多初创公司都在寻找全栈工程师的原因。
三、如何成为一名优秀的全栈工程师
“全栈工程师”一词,最早出现于Facebook工程师Calos Bueno的一篇文章——Full Stack。他把全栈工程师定义为对性能影响有着深入理解的技术通才。
百度百科对全栈工程师的定义是这样的:“掌握多种技能,并能利用多种技能独立完成产品的人。
知识总是相通的,在有了良好的技术基础后,学习其他知识将会变得非常容易。
干系人。
Side Project。
优秀的全栈工程师需要不断地学习来抓住这些变化,跟上计算机领域发展的脚步。
对于将持续学习作为一种生活习惯的人来说,学习新东西并不会成为一种负担,反而是一种乐趣。
每天进步一点点,一年以后你便会获得质的飞跃。
四、为什么每个程序员都应该学习使用命令行
因此,我也经常鼓励身边的程序员们去编写自动化脚本,让自己从重复性的工作中解脱出来。
Try Git(try.github.io/)这个网站
五、重构——系统改善之道
“微服务”架构。SOA——面向服务架构的一次升级。使用微服务框架,可以使开发变得更加简明,然而,它的难点恰恰在于服务的发现与定义。
六、程序员也该懂得“这样就好”
这样就好。
多看(看那些优秀的系统是如何设计类似功能的),多想(站在用户的角度去想他们所提需求背后真正的痛点和问题是什么),多做(不要只停留在需求文档上,应做出能够验证需求的功能原型然后不断确认和改进),多说(在每一个阶段都与用户保持有效的沟通)。
八、我无法写出易读的代码
坏味道。
Design Review与Code Reivew都很重要。
小比大好。
九、一名全栈工程师的Mac工具箱(设计、开发、效率)
Sketch。
Ulysses是我最喜欢的一款MarkDown写作软件。
十、我似乎理解了编程的意义
编程的意义是什么,我又为什么要编程呢?
即使到了今天,我仍非常怀念那段心无旁骛,一心钻研技术的日子。
能力越大,责任也越大。
或许我们编程是为了能够留下一些痕迹吧。
第三章 谈个人发展
知道自己不够聪明,反而能使他们变得更加强大。
不会停止学习的脚步:认为自己不够聪明才会通过不断学习去提高自己。
相信每个人都有一颗追求完美的心,程序员也不例外。
优秀的程序员懂得平衡。
如果你希望变得更加优秀,那你必须具备直面失败的勇气,并学会从每一次失败中获得进步。
反而是那些被认为水平一般的团队,却经常能依靠着团队成员间的通力协作创造出让人惊讶的成果来。
与优秀者同行,你也将变得更加优秀。
二、成为一名自由程序员
建立自己的品牌:你需要为自己建立品牌——Branding,互联网是让你为人所知的最佳场所。
逐步提高投入产出比。
三、专家与普通人的区别在于觉察力
经验是每个人宝贵的财富,能使你对自己所在的专业领域有更深入的理解和认识,也更擅长去解决那些已经出现过的问题。
经验和环境既能使你变得优秀,也会成为你的包袱,如果你想为自己发现一些新的东西,就不能总背负着老旧的包袱。
在我眼中,真正的专家就是那些工作在各自不同领域,有着敏锐觉察力,并能够摆脱
经验和环境的束缚,不断去为大家解决问题的普通人。
四、程序员创业?你需要先避开这些坑
心理学中有一个词叫作“自我效能”,指的是人们对自己能够取得成功的信念——“我能行”。
MVP。
程序员们大多内敛含蓄,喜欢沉浸在自己的程序世界里,而不愿与他人交流。
种子用户。
五、程序员之“美”
我常会和身边的年轻程序员说,那些正在做的工作以及所钻研的技术可能都不是你们存在的真正意义,只有生活才是。
那些美好的事物。
美感经验。
没有人天生便会欣赏,对美的感受恰恰来自于不断累积的审美经验之中。
程序员们常年从事着编程工作,这使他们往往变得过于理性,这虽然能够帮助他们更好地胜任工作,却也在削弱他们对周围事物的感知能力及原本丰富的情感。
“中国文学史上最可爱的女人”。
有境界,则自成高格。
六、建立自己的个人品牌
我们总是把设计师的成果称为作品,而把程序员的成果叫作项目或者产品。
我给自己起的花名叫作“技匠”,顾名思义是技术工匠的意思。
七、你不应该成为一匹独狼
一个人即使懂得再多,也不可能知道所有的事情,即使能力再强,也不可能永远都做出正确的决定和选择。同伴的重要性有时并不在于和你一起.
去完成那些技术工作,而恰恰在于在一些关键的时间点上给予你意见和建议。
构建一个项目或产品就像是一场长跑,按照一定的节奏,持续地进行非常重要。
优秀的程序员绝不孤单,他们的身边不乏志同道合者,这可能也是他们能够变得越发出色的原因吧。
八、未来,有关程序员的10个预言
编程并不是教会一门开发语言那么简单,它让人们得到一种新的思维方式,而这种思维方式如果能在更小的年龄阶段掌握,会让孩子们在长大后能更好地适应未来的工作和生活。
新一代大学生可以同时选择学习UI设计、编程、大数据、机器学习、人工智能等学科中的两个或者任意多个的组合。
九、你也可以写出优秀的技术博客
而我开始也正是这么做的,我所采用的是Hexo(hexo.io/zh-cn/index…
Hexo是一个基于Node.js的博客框架,只需在终端里输入几个简单的命令便可以完成一个静态博客网站的搭建,同时它还支持用Markdown来编写文章。
适合作为技术博客的平台有很多,比如CSDN、慕课、稀土掘金都提供了不错的写作功能。
简书。
第四章 谈编程中的教与学
自学编程会是一个漫长而艰辛的过程。
二、为什么我们不再购买技术类书籍
总之,先尝试自己解决,如果不行,则应选择对方乐于接受的方式寻求帮助。
三、我眼中的技术干货与湿货
这不由让我联想到,大棚里的蔬果总有着漂亮的外形,但说到口味和营养,却仍是那些在自然环境下经过风吹日晒,在雨露滋养中生长的会更胜一筹。
四、为什么你应该让你的孩子尽早学习编程
和学习语言一样,学习编程也是越早越好。
五、写作与写代码
现在的应用变得越来越重视用户了,从UI(用户界面)设计到UX(用户体验)设计再到情感设计,软件设计师们越来越重视用户的使用感受。
六、如果要为孩子写一本编程书
这是因为随着技能的提升,你做出来的东西总是会比过去更好,它对所有学习者都是有效的。
七、学习编程从“玩”开始
Playground是苹果公司推出的一款在iPad上学习编程的APP。
编程是编写程序(命令)的简称,这是你与计算机的一种交流方式,通过你编写的这些命令,可以让计算机去帮助你做很多有意思的事情。
玩物丧志。
第五章 谈自学设计
设计师(我们更多称为“美工”)
度娘”(百度搜索)
Sketch已经大幅超越Photoshop成为设计师们首选的UI设计工具。
另一个获得灵感的方法是收集优秀的设计作品。Ember是我用过的用来收集设计素材的最佳工具。
你所做的每一件事情,它的背后都可以和艺术联系在一起。写作、环球旅行、烹饪、摄影。你会发现当你不断完善某一项技能的同时,其他技能也会得到加强。
二、那些永恒的设计原则
我所知道的设计师分类就包括:工业设计、图形设计、UI设计、UX设计,等等。
设计应源于对问题本身的思考,并做出能够解决问题的相应设计。
优秀的设计是尽可能少设计。
少即是多。
无印良品。
人的大脑一次同时最容易记住3件事情。就像我们记电话号码时,总是将它分为3个数字一组进行记忆。另外,3所构成的形状也最稳定,最容易让人产生美感。
使用网格进行设计是建立秩序的最有效途径。
平衡是另一个非常重要的设计原则,对于相同的设计元素,我们很容易使用对称的方法来处理平衡。
如果你使用的是960Grid这种960px宽的网格系统,并且你希望分出两栏布局时,就可以使用960/1.618=593,593px的位置就是黄金分割点。因此,对两栏的网页布局,将左边栏宽度设为593px,将右边栏宽度设为367px(960-593)就可以了。同样当你确定了一张图片的宽度为600px时,采用黄金比例,它的高度就可以设为370px左右。
过多地强调等于没有强调,而且还会造成页面的混乱。而不分主次的强调则会给使用者带来疑惑。
强调的方式有很多种:色彩、对比、形状等。
三、寻找设计灵感
设计灵感并非与生俱来,而是需要你通过不断地寻找去发现它。
同样,当一个好的想法浮现在脑海中时,千万不要错过,你应该想尽一切办法,尽早把它记录下来。
收集是每个设计师都会去做的一件事情,然而不同之处在于收集的目的及如何收集。
能工摹形,巧匠窃意。
四、因为“美”而学习设计
从认识到自己的“丑”,到尝试着去寻找“美”,因为“美”而去学习设计,又从设计中获得感知与创造美的能力。美就在每一个人的身边,只要用心,你就能发现和拥有它。
五、浅谈企业级产品设计
用户黏性。
提供有效的激励:游戏中我们通过那些虚拟的数值获得激励,而在那些企业级产品中,我们同样也有很多方法对用户产生激励效果,比如,产生比较就是一种常见的方式。
而对于企业级产品来说,如何减轻用户的压力显得尤为重要。