程序员实用算法 源码_从菜鸡到大佬——程序员们,请收下这份职业规划全攻略...

作者:阿诺,有删改

引言

John Z. Sonmez是一位来自硅谷的杰出程序员,2016年他出版了《软技能:代码之外的生存指南》一书。这本书在中国翻译出版之后,引起了国内广大程序员的热烈讨论。

424602608a437646bd23835c475d6a19.png

许多人从那本书中发现,原来程序员们可以在事业上有更多的选择,从书中也学习到了很多提升效率,精进技术能力与管理水平的方法。

如今,John推出了他的新作《软技能2:软件开发者职业生涯指南》。这本书则将焦点放在了程序员的职业发展之路上,John以自己的经历与体会告诉大家,如何突破职业瓶颈不断进取。

一名程序员把代码写好,这是最基本的职业要求。但如果想要在软件开发的职业道路上走得更远,仅写好代码却又是不够的。幸好,John把那些除了写代码还需要学会的内容,都放进了《软技能2:软件开发者职业生涯指南》之中。

e22195d8f53b3ed46ed3001f57e9cc0b.png

对于身处任何一个阶段的程序员来说,这本书都是一个福音。当对职业发展感到迷茫的时候,不妨拿起这本书来翻一翻,兴许就能找到突破口了。

成为程序员之前

废话不多说,程序员要学会的第一件事当然就是写代码,看看《软技能2》是如何指导新人学习写代码的吧!

打好基础:算法与数据结构

无论是在校大学生还是编程爱好者,一定都接触并使用过至少一种编程语言了。不管起步多么Low,起码是学会了基本的语法,知道顺序、选择、循环语句是怎么回事。不过,到了实际工作中,需要达到怎样的编程水平呢?

编程语言只是一种工具,它能实现编程者利用计算机完成一项任务的意图。决定编程水平的不仅是对编程语言的熟悉程度,还包括算法与数据结构能力。像算法与数据结构这样的基础课程却是要必须先学好的。

计算机本质上就是一台资源有限的运算机器,程序员要做的是如何最大化地使用这些资源达成目标——先学会准确地判断问题类型,然后评估实现的复杂度,这包括时间复杂度与空间复杂度,最后选取最合适的算法来解决问题。

数据结构则是对建模能力很好的培养。所谓建模能力,就是能够很好地将现实问题,投射到计算机的运算空间,通过有限步的计算将问题加以解决。这决定了一名程序员掌控系统规模的能力,如果一个系统在开始时规划建模不合理,那么其复杂度就会随着规模的扩张而线性增长,最后系统在错综复杂的细节里崩溃。

所以,在学会使用编程工具之后,一定不要高兴太早,还要花大量的时间学习算法与数据结构知识。这样才能为接下来的学习打好基础。

做中学:在实践中领会

练好了基本功,接下来就是要为工作具备动手能力了。《软技能2》建议在学习一项技术的时候,不要仅满足于会用,而要寻找到一个实际的需求去应用这项技术。

ca496b2b4343be9355f9fbcde8ca3623.png

Charles Deluvio 拍摄,来源:Unsplash

对于在校大学生来说,编程语言的课堂作业一般都会要求实现一个具体的应用。大学生们要重视这种实践性的作业,不要觉得“做这个能有什么用?” 而不去认真对待。因为编程能力是需要耐心和毅力才能培养出来的,不是说寄希望于进了公司会有人来教会自己。

至于更有追求一些的话,那则可以从自己感兴趣的领域出发,去学习研究新技术。例如,作者John最早学习编程的动力,是想给自己开发游戏玩。当然,他后来才知道开发一款游戏和玩游戏根本不是一码事,但兴趣已经支撑着他学会了不少技能。

“做中学”是一个很好的理念,它可以让学习者将精力集中在最有用的点上。一门编程语言没有必要掌握到100%的程度才去动手实践,在Jonh看来,当掌握了编程语言20%最核心的部分时,就可以开展实际工作了。

因为只有动手走起来,才会关注到怎样通过编程去解决问题。例如,如何设计UI以采集数据;使用何种数据库存储数据;遇到性能问题时,如何优化算法提高效率。如果不是将做一个有实用功能的程序作为目标,恐怕连调试器都有可能不知道该如何使用。这便是做中学的意义与价值所在。

在这个过程中,学习者已经能够使用开发工具,实现简单功能的程序了。更深入一些的,应该还会使用框架,接触到设计模式的知识了。

到了这一步,已经可以去挑战一下,看看能不能找到一份软件开发的工作了。

怎样找到一份程序员的工作

开始找工作的第一步当然是给自己制作一份光鲜的简历。尽管作为一名新人来说,不可能有多么丰富的经验,但在简历上依然可以表现出自己的亮点。John的建议很有意思,他认为求职者不要自己写简历,而是交给专业的简历写作者。

写简历有一个重要的原则,就是一定要诚实可信,不能夸张到全是水份。因为有经验的面试官两三个问题就能探出虚实来,那时候吃亏的还是求职者自己。但简历内容也不必一五一十好的坏的全写出来,要突出表现出自己的亮点,这些可以是做过的实践、资格认证、性格特点、兴趣爱好等。说白了就是要学会夸自己,还要在事实的范围以内。

当简历有幸被HR选中,接下来就要坐到面试官的前面了。面试过程一般分为笔试与面谈,笔试好说,现在互联网上有海量的题可以去刷。面谈才是一场面试中的重头戏,说它占了七分甚至八分的比重都不为过。

55f59c1d6d34c457e795425e6eda004b.png

有一点要注意的是,求职者在面谈环节不必要去过分“表演”。每个人的性格都不相同,如果要拧着自己去弥补性格中的另一面,则多少有些得不偿失。例如,一个平常内向少语的人,非得表现得外向健谈,估计反而会给人不伦不类的感觉。所以,做真实的自己就可以,真诚自信才更容易打动面试官。

说到找软件开发的工作,不能不提到市面上林林总总的编程培训班。John在书中提到在美国也有这种形式,就是编程训练营,这是那些非专业人士很好的选择。但中国的国情显然不同,美国的大学里计算机教育水平高,学生动手能力也强。但中国的大学里教学注重基础理论,实用性不强,导致很多专业的大学生毕业后也会选择花钱去报一个编程培训班。

我无意去比较编程培训班哪家强,但只要不是太坑的,基本上都会做到三件事。第一是在短时间内高强度地让学员完成一个项目;第二是会给学员大量刷面试题;第三则是传授面试中的各种套路及应对之策。

如果本身是有一定基础的学员,通过编程培训班强化一下,这对他来说是一次值得付出的投入。但如果本身专业功课没有学好,指望编程培训班突击两三个月就脱胎换骨,这是不现实的。

所以,一位有志于要投身程序员事业的新人,最好还是抛掉幻想,从基本功开始修练,将这看作一场十年甚至二十年的艰苦历程。

成为程序员之后

成为一名职业程序员,仅是走出了第一步。相信大家都在网上看到过讨论,就是35岁以后的程序员要何去何从。程序员到了35岁就会被这个世界抛弃吗?好在《软技能2》告诉了我们程序员的精进之路。

职业素养

有一种我们都见过的程序员:说技术,他不好不赖;说业绩,又没有什么亮点。总是看到他在很多项目里出入,就像万精油一样四处被使用。加薪晋级又总是跟这样的人无缘,看似做了不少事,混得却像可有可无一样。问题出在哪里?

问题就是职业素养不过关。这样的程序员有个共通之处,就是不喜欢承担责任,安排什么活就干什么。就算要干还必须是很具体的活,如果任务定得大一些,他们就会找各处理由推托。久而久之,他能接到的也就是各种具体而繁琐的工作,这对于个人成长来说显然没有助益。

所以,程序员要有承担责任的意识。我们要站在比本职工作更高一级的角度来思考。书中John建议程序员要以比本职位高两级的方式来着装,这也暗含了思维也要站到更高一层的道理。说白了,程序员最好能充分地意识到自己所做的工作,在公司的业务中起到的是什么作用。

其次,还需要做到重视自己的承诺,答应的事情是一定要做到的。责任承担下来了,最后不了了之,这个结果更坏。承担责任不是信口开河,而是在自己的能力边界上刚好突破一些。每次都挑战一下自己,累积下来的成功就很可观了。

214a195ad0a2562a028921eb1c62eb5f.png

培养职业素养,就从勇于担责,言出必行做起吧。

自动化思维

从瀑布式过程到敏捷开发,不管软件工程理论怎么演化,实际工作中自动化已经是无可争议的趋势。这些自动化工作包括开发管理、测试管理、持续集成与部署。可以说,不具备自动化思维的程序员,犹如还处在蛮荒时代一样,做什么事都靠着自己的蛮力去完成。辛苦自不必说,效率也被别人甩下几条街,到头来怎么被淘汰的都不知道。

在这里,程序员的技能就必须要扩充了,真的不能只将程序员的工作定义为单纯地写代码。就从开发管理说起,现在一般的公司都会有源码管理服务,例如git、svn等。程序员们在完成一天的开发工作之后,就会将自己的代码签入源码管理服务中。这在以前可能就万事大吉,可以下班回家浪去了。

但要做到持续集成,则需要部署一套自动化的构建系统,当任何一段代码被签入时都会触发一次构建活动。这就要求程序员在开发时就要把事情做完,包括编译通过、自测完成。那么问题来了,编译好说,只要编译器不报错就行,自测怎么做?John给出的建议是程序员要编写完善的单元测试。

为什么要强调程序员一定要有自动化思维,重点就在这里了。我们都知道要做单元测试的重要性,但偏偏实际工作中总有各种借口和理由不去完成它。例如工期太紧,项目着急上线等等,最后匆忙写就的代码上线就出各种问题,程序员们只好熬夜打疲劳战调bug,硬生生又让工作回到了刀耕火种的时代。

单元测试还只是最基本的自动化测试场景,在其上还能构建出组件测试、系统测试、集成测试等。系统部署工作也是一样,在自动化思维指引下,devops这个概念就是赋予了程序员更多的运维职责。

从这些可以看出,以后开发、测试、运维工作的界限会越来越模糊。在各种工具和服务的协助下,程序员们的工作效率会变得越来越高,软件产品的质量也会更有保障。其实很多公司都已经有这样的系统和服务,程序员们也遵守着公司的规定在做,但如果能主动思考清楚其意义所在,明显比只是被动执行要强得多。

自动化思维可以说是程序员成长之路上的火箭助推器。

成为更厉害的程序员

到这里,程序员已经是一名非常棒的职业人了。但John告诉我们,程序员们还可以上到更高的台阶。他自己就是一个鲜活的例子,他通过在线课程影响了千百万的程序员,写作出书指导程序员职业发展之路,并且自己也实现了财富自由。下面我们就来看下John的做法和建议。

打造个人品牌

John最为推崇的一个建议就是程序员们要创建属于自己的博客,这个目的就是为了打造个人品牌。

创建个人博客和打造品牌之间有什么关系?John对此的回答是,我们要想具备影响力,给他人传播价值是最好的方式。当自身的价值被认可,也就是品牌被树立起来的时刻了。而程序员结合自己的技术专长,写作有价值的文章,是再自然不过的途径了。

728faa8d4c3ce188e4c46fdbbff83a79.png

John坦承,他的工作与生活是在博客上的写作之后发生了重大的转变。他从一个默默无闻的职业程序员,转而成为一名明星咨询师,帮助了众多的程序员们。用John自己的话来说,这就是一个名利双收的过程。

当然,这样的成就也绝非一夕之功。John的态度很简单,从一开始就是单纯地希望帮助到身边的人。他在做这件事之前完全没有想过,坚持写作能让他在财务上有多少收获。只是后来他的文章被更多的人看到并学习,他才意识到自己原来已经有了这么大的影响力。

所以,想要在人生之路上更上一层楼的程序员们,赶紧打开自己久未更新的博客,写下新的篇章吧!

生活与工作不是平衡的

诚如John在书中所言,如果这本书只看一章,他会建议读者就看第39章“等量齐观:工作与生活的平衡之道”。

在John对生活和工作的观点看来,追求工作和生活对半开式的平等这是不可能的。一个人如果想要这样的平衡,可能工作的时候惦记着家里,在家里却又操心着没完成的工作,结果哪件事都没做好。

John的建议是改变对工作和生活的看法,不要将这两者看作是二元对立的关系,将工作也看作是生活的一部分。这并非鼓励抛家不顾的工作狂式的精神,而是在一个阶段内做好一件事情。这可以是专注地完成工作,也可以是全身心地投入到家庭的活动中去。总之在选择做一件事时,就不要将其他事情放在心上,而是将它放在日程表上。

程序员们在事业上不断进取时,也必然会遇到这个问题,就是家庭生活也需要自己的存在。首先认识到工作和生活从来就不是平衡的,这是解开心结的第一步。接下来就是和家人充分的沟通,制定工作和家庭活动的计划日程表,过好每一天的生活。

千万不要怀抱着“我拼命工作都是为了这个家”的想法,只把给家庭带来经济利益放在第一位,却忽略了家庭成员的感受。说一句大实话,工作上真不会少了谁就转不开的。另外就是钱也是永远赚不完的,而陪伴家人的时间一旦失去了,则是再也回不来的。

John希望我们思考清楚,并且努力去做到的,就是一个厉害的程序员,总是主动地在选择自己想要的生活。

终身学习

程序员们不论上升到哪个阶段,都要不断地学习,保持旺盛的好奇心,培养对技术与市场的敏锐洞察力。在软件开发这个职业上,想必怎么强调学习的重要性都不为过。不过很多程序员会搞错学习的重点。

有的程序员会将学习定义为工作上遇到搞不定的任务,就去搜索一下,有现成的代码拿来就用就好。如果是复杂一点的框架,那就花时间学习一下再用到工作中吧。不能否认这也是学习的一种,但它对于个人的成长来说几乎无用。

因为这样还是在个人的知识边界之内,就好像绕着一个环形的跑道不停地在跑,始终在重复着手头上那些事。只有不断地去突破边界,才能看到更加广阔的世界。到了那个时候,程序员们会发现,35岁这个话题不过是个伪命题而已。

5994a57ed26e9975265a1c84a848181d.png

最难的事情还就在于通过学习的方式突破自己。一份忙碌的工作,每月按时发放的薪水,会给人一种安全感,但这种感觉是虚幻的。因为互联网行业竞争太激烈,没有哪家公司可以说自己是绝对安全的。身处这个行业中的程序员们就更要看清楚这一点。

所以,工作再忙,程序员们也要挤出时间来为自己的长远将来做打算。学习的领域可以扩展到许多方面,例如领导力、内在成长、演讲技能、写作技能等。这些事情可能在当前看起来无甚影响,但在将来一定会产生不可思议的结果。

不要再说“等我有空了一定去学XXX”,现在就站起来去学习吧!

结语

《软技能2》整本书看下来,可以说John再次给程序员们奉献了一场认知的盛宴。John就他自己所知的内容,对程序员在职业发展上做了详细的指导。从无经验的新人如何起步,到职场老鸟如何让自己扬名立万,都是满满的干货。

诚然,道理都是简单的,John苦口婆心地说了这么多,终究还是要个人自己去体验并实践的。其实在软件开发的职业这条道路上,没有什么捷径可走,甚至可能比别的行业还要更辛苦一些,竞争也更激烈一些。

但这也是软件开发工作的迷人之处,它能让人体会到创造的乐趣,通过许多人都在使用的软件或者服务,开发者获得了无以伦比的成就感。John以自己的经历告诉我们,一位程序员可以达到怎样的层次。更重要的是,他认为任何一位程序员其实都能做到这些。

真心希望看到此文的程序员们都能在职业之路上不断前进,拥有自己想要的生活!

推荐阅读

《软技能2 软件开发者职业生涯指南》

03d3008a8784490f6f9375d8dc413d39.png

[美]约翰·森梅兹(John Sonmez)

本书是《软技能:代码之外的生存指南》一书作者的新作,主要围绕软件开发从业者职业生涯的发展历程,描述软件开发者在职场中需要具备的各种“软技能”—如何入行成为软件开发者,如何学会第一门编程语言,如何写求职简历,如何准备面试,如何选择工作岗位,如何选择技术方向,如何拓展技术技能,如何与团队和领导融洽相处,如何以著书立说方式为自己在业界赢得赞誉,等等。

本书适合各层次的软件开发者阅读。尽管本书名义上是专门写给软件开发者的,但实际上这也是一本关于管理个人职业生涯以及如何获得成功的书,对软件开发行业的各类从业者做好职业发展规划都很有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://www.400gb.com/u/256394 译者序 前言 致谢 第1章 绪论  1.1 评估算法  1.2 修改算法   1.2.1 主要的优化:I/O   1.2.2 主要的优化:函数调用  1.3 资源和参考资料 第2章 基本数据结构  2.1 链表   2.1.1 双向链表   2.1.2 链表的其他特征  2.2 栈和队列   2.2.1 栈的特征   2.2.2 队列的特征 第3章 散列  3.1 散列的概念  3.2 散列函数  3.3 冲突解决方法   3.3.1 线性再散列法   3.3.2 非线性再散列法   3.3.3 外部拉链法  3.4 性能问题  3.5 资源和参考资料 第4章 查找  4.1 查找的特征   4.1.1 准备时间   4.1.2 运行时间     4.1.3 回溯的需要  4.2 蛮力查找  4.3 Boyer Moore查找   4.3.1 启发式方法#1:跳过字符   4.3.2 启发式方法#2:重复模式  4.4 多字符串查找  4.5 用于正则表达式的字符串查找:grep  4.6 近似字符串匹配技术  4.7 语音比较:Soundex算法  4.8 Metaphone:现代的Soundex  4.9 选择技术  4.10 资源和参考资料   4.10.1 通用参考资料   4.10.2 Boyer Moore   4.10.3 多字符串查找   4.10.4 正则表达式查找   4.10.5 近似字符串匹配   4.10.6 Soundex算法和Metaphone算法 第5章 排序  5.1 排序的基本特征   5.1.1 稳定性   5.1.2 对哨兵的需求   5.1.3 对链表进行排序的能力   5.1.4 输入的阶的相关性   5.1.5 对额外存储空间的需求   5.1.6 内部排序技术与外部排序技术  5.2 排序模型   5.2.1 冒泡排序   5.2.2 插入排序   5.2.3 希尔排序   5.2.4 快速排序   5.2.5 堆排序  5.3 对链表进行插入排序  5.4 对链表进行快速排序  5.5 对多个键进行排序——不稳定排序的修正方法  5.6 网络排序  5.7 小结:选择一种排序算法  5.8 资源和参考资料 第6章 树  6.1 二叉树   6.1.1 树查找   6.1.2 节点插入   6.1.3 节点删除   6.1.4 二叉查找树的性能   6.1.5 AVL树  6.2 红黑树  6.3 伸展树  6.4 B树   6.4.1 保持B树平衡   6.4.2 实现B树算法   6.4.3 B树实现的代码  6.5 可以看见森林吗  6.6 资源和参考资料 第7章 日期和时间  7.1 日期例程的库  7.2 时间例程  7.3 用于日期和时间数据的格式  7.4 最后的提醒  7.5 资源和参考资料 第8章 任意精度的算术  8.1 构建计算器8.2表示数字  8.3 计算  8.4 加法  8.5 减法  8.6 乘法  8.7 除法  8.8 关于计算器要注意的最后几点  8.9 用于计算平方根的牛顿算法  8.10 分期付款表  8.11 资源和参考资料 第9章 数据压缩  9.1 行程编码  9.2 霍夫曼压缩   9.2.1 代码   9.2.2 其他问题  9.3 滑动窗口压缩  9.4 基于字典的压缩(LZW)   9.4.1 LZW算法的伪代码   9.4.2 LZW压缩的实现   9.4.3 填满字典  9.5 使用哪种压缩方法  9.6 资源和参考资料 第10章 数据完整性和验证  10.1 简单的校验和  10.2 加权校验和  10.3 循环冗余校验   10.3.1 CRC CCITT   10.3.2 CRC 16   10.3.3 CRC 32   10.4 资源和参考资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值