mirror of
https://github.com/cheetahlou/CategoryResourceRepost.git
synced 2025-10-21 01:13:45 +08:00
mod
This commit is contained in:
35
极客时间专栏/10x程序员工作法/结束语/第三季回归 | 我们一起来写好代码!.md
Normal file
35
极客时间专栏/10x程序员工作法/结束语/第三季回归 | 我们一起来写好代码!.md
Normal file
@@ -0,0 +1,35 @@
|
||||
<audio id="audio" title="第三季回归 | 我们一起来写好代码!" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/01/43/013ffe3361243b5cfde19bae89274743.mp3"></audio>
|
||||
|
||||
你好,我是郑晔,我又回来了!
|
||||
|
||||
在《[10x 程序员工作法](https://time.geekbang.org/column/intro/100022301)》中,我们讲了工作原则,在《[软件设计之美](https://time.geekbang.org/column/intro/100052601)》,我们讲了设计原则。有不少同学通过各种途径和我表示,这两个专栏让他们受益匪浅。但也有人和我提出,虽然觉得有收获,但还不过瘾。
|
||||
|
||||
这些原则虽然很好,但怎么应用到自己的实际工作中,完全取决于个人的理解,经验丰富的人或许可以直接改变自己的行为,而经验少的人,从中的获得就完全取决于个人的悟性了。
|
||||
|
||||
比如,我在两个专栏中都讲到了单一职责原则,最终得出的结论都是要把代码写短小。但什么叫写短小,不同的人理解起来就是有差异的。
|
||||
|
||||
有一次,我在一些人面前演示了如何将一段代码重构成小函数,然后,我问听众,你们可以接受一个函数代码行数的上限是多少?一个听众很认真地说,100 行。我默默地看了看被我重构掉的那个“不好”的函数,好像也没有 100 行,按照他的标准,那个函数根本不需要改。
|
||||
|
||||
还有一次,一个颇有经验的前辈在我面前说自己写代码的要求很高,函数要求写得很短。我不明就里地问了一句,你要求一个函数不得超过多少呢?他说 50 行。
|
||||
|
||||
50 行也好,100 行也罢,在我看来,这简直是一个天文数字。我通常对自己的要求是,像 Java 语言这种表达能力一般的语言尽可能 10 行之内搞定,而像 Python、Ruby 这类动态语言,5 行代码就可以解决大多数问题,而且很多代码一行就够了。
|
||||
|
||||
在自己实际的项目中,考虑到团队的协作,我在静态检查中配置的参数是 20 行。换言之,一个函数超过 20 行,连构建都是无法通过的。
|
||||
|
||||
从这些例子中你可以看到,虽然大家都遵循了同样的原则,但具体体现在代码上,却是千差万别的。
|
||||
|
||||
也正是因为理解的差异,造成的结果是,虽然许多人懂得了很多道理,依然不能很好地完成自己的本职工作。许多人日夜辛苦地调试的代码,其实在写出来的那一刻就已经漏洞百出了。
|
||||
|
||||
如果能够知道这些代码是有问题的,在写代码之初就把这些问题消灭在萌芽中,日后的辛苦就可以节省出不少。
|
||||
|
||||
Martin Fowler 在《[重构](https://book.douban.com/subject/30468597/)》这本书里给这种有问题的代码起了一个很有特点的名字:代码的坏味道。
|
||||
|
||||
有追求的程序员都希望自己能够写出整洁的代码,而这一切的出发点就是坏味道。只有拥有对于坏味道的嗅觉,才有机会对代码进行重构,也才有机会写出整洁的代码。
|
||||
|
||||
所以我做了第三个专栏,在这个专栏里,我们就从代码的坏味道出发。我会给你提供一些非常直观的坏味道,让你看一眼就知道代码有问题。在这些坏味道中,有一些是你已经深恶痛绝的,比如,长函数和大类;有一些则是在挑战你的编程习惯,比如,else 语句和循环语句。这些坏味道的知识即学即用,对照你的代码,你立刻就能发现很多问题。
|
||||
|
||||
按照我们专栏一贯的风格,我不仅仅会告诉你一段代码是坏味道,也会告诉你这些坏味道之所以为坏味道背后的道理,还会和你讨论如何去重构这段代码。
|
||||
|
||||
有了《[10x 程序员工作法](https://time.geekbang.org/column/intro/100022301)》或《[软件设计之美](https://time.geekbang.org/column/intro/100052601)》这两个专栏的积淀,当你再去学习新专栏的时候,之前学习的这些原则就实打实地体现在对于代码的改进上,让你修炼的内功有了更好的用武之地。
|
||||
|
||||
来吧,欢迎加入《[代码之丑](https://time.geekbang.org/column/intro/100068401)》!请再次和我一起踏上程序员精进之路,我们一起修炼,不断打磨自己编写代码的手艺!
|
36
极客时间专栏/10x程序员工作法/结束语/第二季回归 | 我带着软件设计课回来了!.md
Normal file
36
极客时间专栏/10x程序员工作法/结束语/第二季回归 | 我带着软件设计课回来了!.md
Normal file
@@ -0,0 +1,36 @@
|
||||
<audio id="audio" title="第二季回归 | 我带着软件设计课回来了!" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/65/d5/6570ecfdfc0df2cf03b5c1dee525a7d5.mp3"></audio>
|
||||
|
||||
你好,我是郑晔!
|
||||
|
||||
在这个专栏的结束语中,我说过,如果以后有机会,我会再来与你分享我对软件开发的理解。我也和编辑说过,如果这个专栏合作顺利的话,我可能会写下一个专栏。
|
||||
|
||||
没错,我又回来了!
|
||||
|
||||
我们都知道,《10x程序员工作法》这个专栏,本质上是在讲如何有效工作,尽量地排除外部干扰,**不让别人给我们添麻烦**,把精力放在值得做的事情上。然而,当我们真正开始做值得做的事情后,我们做得又怎么样呢?
|
||||
|
||||
- 别人修改了他的程序,结果你的代码崩溃了,因为你们在底层共用了一个变量。
|
||||
- 不同的项目组竞争公共的测试环境,测出来的常常是一些可以在单元测试里就解决的小问题。如果问他为什么不自己做好单元测试,他的回答常常是不好测。
|
||||
- 为了提高一段代码的处理性能,我们使用了多线程处理。结果,更多的Bug随之而来。
|
||||
- ……
|
||||
|
||||
是不是有一种熟悉的感觉扑面而来?在我的职业生涯里,我接触过的许多项目都会不停地出现类似的问题。事后究其原因,很大一部分都是软件设计没做好所造成的。换句话说,都是程序员自己给自己挖的坑。
|
||||
|
||||
**如何避免给自己找麻烦**,这就是我要在新专栏里讨论的内容。
|
||||
|
||||
所以这次,我准备和你聊一下软件设计。
|
||||
|
||||
或许你会好奇,这些东西和软件设计有关系吗?软件设计不就是设计模式吗?我会在新专栏里告诉你,软件设计可比你想的内容多得多。它不仅可以教会我们如何组织代码,还会给我们提供一把尺子,用以衡量我们的设计。
|
||||
|
||||
学会了软件设计,我们甚至可以把许多问题消灭在萌芽阶段,不会让它们为害人间。
|
||||
|
||||
如果说**这个专栏是在告诉你要做正确的事**,做有价值的需求,别把时间浪费在不该做的事情上。那[软件设计专栏](http://gk.link/a/10iul)就是告诉你如何把事做对,**如何建立有效的模型,划清模块之间的边界**。所以,二者可谓一脉相承。
|
||||
|
||||
这个专栏是我工作之外的思考,新专栏则是我本职工作的深思。来吧!加入我的软件设计课,和我一起继续扫除障碍,让我们的开发之旅更加顺畅!
|
||||
|
||||
为了感谢老同学,我还准备了一个「专属优惠」:
|
||||
|
||||
5 月 25 日,专栏上新时,我会送你一张 10 元专属优惠券,可与上新优惠同享,有效期截止 6 月 5 日,建议尽早使用。
|
||||
|
||||
**点击下方图片**,立即免费试读新专栏。
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/e0/37/e0651b2b18a5f584b6798792e6bcb337.png" alt="">](https://time.geekbang.org/column/intro/313?utm_term=zeusBE50C&utm_source=app&utm_medium=10xjiacan&utm_campaign=presell-313&utm_content=yinliu)
|
102
极客时间专栏/10x程序员工作法/结束语/结束语 | 少做事,才能更有效地工作.md
Normal file
102
极客时间专栏/10x程序员工作法/结束语/结束语 | 少做事,才能更有效地工作.md
Normal file
@@ -0,0 +1,102 @@
|
||||
<audio id="audio" title="结束语 | 少做事,才能更有效地工作" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/03/89/033abb6b19b037cc938c25ba719ac189.mp3"></audio>
|
||||
|
||||
你好,我是郑晔。
|
||||
|
||||
在这个专栏里,我讲过很多东西,几乎涉及到软件开发的方方面面,但有一个重要的方面,我却从来没有说过,那就是算法。
|
||||
|
||||
因为我一直把它当做不言而喻的基本功,认为每个程序员都应该掌握。在我们专栏的结束语中,我就用这个没有涉及过的话题来开篇吧!
|
||||
|
||||
## 算法的差异
|
||||
|
||||
排序算法是每个程序员都会学到的内容,大家对各种算法也是如数家珍:插入排序、冒泡排序、归并排序、堆排序、快速排序等等。我们也知道各个算法的复杂度,比如,插入排序是 O(n^2),快速排序平均情况下是 O(nlogn)等等。
|
||||
|
||||
你有没有想过一个问题,不同算法的复杂度本质差别到底是什么呢?我们就以插入排序和快速排序为例,为什么快速排序要比插入排序快呢?
|
||||
|
||||
我不打算做算法分析,直接公布答案:因为做比较的次数少。为什么同样的排序,比较次数会有差异呢?因为插入排序每次循环只关注当前的目标,循环之间没有关系,而快速排序在做不同划分时,上一次的结果对下一次有助力,因此它省下了不少的比较次数。
|
||||
|
||||
明白了这个道理,再来看所谓的算法优化,**其实就是尽可能利用已知的信息,少做不必要的事。**
|
||||
|
||||
再来看一个常见的面试题,给你一堆数,找出前100个。很多人直觉就会想到排序,然后选出前100个。这种做法固然可行,但一定是做多了,因为这里需要的是找出前100个数,而不是要100个有序的数字,更不是要所有的数都有序。
|
||||
|
||||
说到这里,你就知道了,只要把数据划分开就好,并不需要排序,如果划分点不是第100个元素,就向着100所在的方向继续划分就好。
|
||||
|
||||
计算机是最擅长处理繁琐重复工作的,即便如此,我们依然要做算法优化,原因是当数据规模大到一定程度时,不同复杂度的算法差别就非常明显了。算法没用好,计算机硬件再好,也是徒劳的。
|
||||
|
||||
有一则《计算机程序设计艺术》作者[高德纳(Donald Knuth)的轶事](http://book.douban.com/subject/10432364/),他年轻时参加算法大赛,用最差的系统击败了诸多对手,拿到算法执行效率的冠军,凭借的就是其强大的算法优化功力。
|
||||
|
||||
对于计算机,算法尚且如此重要,我们面对工作时何尝不是如此呢!
|
||||
|
||||
## 有效工作
|
||||
|
||||
《10x 程序员工作法》,也许有的同学最初看到这个标题就急急加入了,以为会从这个专栏中学习到一些“以一抵十”的编程技法,对不起,我彻底让你失望了。我非但没讲太多编程的技法,甚至还从各种角度劝你少写代码:无论是向产品经理提问题,还是让你在前面多考虑设计。
|
||||
|
||||
难道不是做得越多才越高效吗?
|
||||
|
||||
插入排序并不会因为干的活多,就比快速排序得到更高的评价,因为它们比的是谁排得快。工作效率高,不是因为代码写得多,而是有效工作做得多。
|
||||
|
||||
如果 CPU 都被无效指令占据了,哪有时间执行有效指令呢?即使你很忙碌,但工作进展依然是收效甚微,因为无效工作占据了你太多的大脑,让你不能聚焦在正经事上,当然就是效率不高了。
|
||||
|
||||
其实,这个专栏的内容在我脑子里已经盘旋很多年了。不过,即便在专栏筹备期,我已经备了很多篇稿子之后,我依然没有找到一个准确的说法能够描绘内心的想法。
|
||||
|
||||
我想过“程序员的职业素养”,但似乎这会让专栏朝着职场行动指南的方向努力;我想过“高效工作”,但实际上我也不打算讨论那些工作技巧。直到上线日期临近,我的编辑实在受不了我的拖延,坐下来与我交流了很久,我才终于找到了内心的那个词:有效。
|
||||
|
||||
**我在这个专栏真正探讨的主题是,有效工作。**
|
||||
|
||||
**有效工作,需要我们把力量聚焦到正确的地方,做本质复杂度(Essential Complexity)的事情,少做无意义的事情。**
|
||||
|
||||
我曾经在一个大公司做咨询,按照他们的统计,线上60%的代码从来没有运行过。我们都知道,一多半的代码增加的可不只是一多半的工作量,团队可能需要的是几倍甚至几十倍的心力去维护它。
|
||||
|
||||
当然,有效工作最终没有成为这个专栏的名字,而用了更有个性的《10x 程序员工作法》。这个名字也不错,因为在我看来,很多程序员做的是负功,比如,写那60%代码的程序员。只要能做到有效工作,效率自然会高出业界平均水平很多。
|
||||
|
||||
怎么才能有效工作呢?我在专栏中已经给你讲了很多,小结一下就是:
|
||||
|
||||
<li>
|
||||
拓展自己的上下文,看到真正的目标,更好地对准靶子,比如,多了解用户,才不至于做错了方向;站在公司的层面上,才知道哪个任务优先级更高;站在行业的角度,而不局限于只在公司内成为高手,等等。
|
||||
</li>
|
||||
<li>
|
||||
去掉不必要的内容,减少浪费,比如,花时间分析需求,不做非必要的功能;花时间做好领域设计,别围着特定技术打转;花时间做好自动化,把精力集中在编码上,等等。
|
||||
</li>
|
||||
|
||||
要想有效工作,有两点非常重要。一方面,意识上要注意自己工作中无效的部分。这就像一个开关,拨过去就好了。所以,读这个专栏,有人常有恍然大悟的感觉,也有人觉得很简单。
|
||||
|
||||
很多时候,你只是不知道,就像我在专栏中提到,要问产品经理问题,这是很多人没想过的。每篇文章后面的那一句总结,就是这样的开关,拨过去就好。
|
||||
|
||||
另一方面,要构建自己关于软件开发的知识体系,这是要花时间积累的。在这个专栏中,我给你讲了很多最佳实践,就是让你知道,在某些方面,有人已经做得很好了,花时间学习,比自己从头摸索好很多。
|
||||
|
||||
这就像所有的数学公式一样,理论上你都可以自行推导,但肯定不如从教科书上学得快。
|
||||
|
||||
## 藏经阁目录
|
||||
|
||||
虽然我讲了这么多内容,但实际上,因为篇幅的关系,这只是冰山一角。其实,我给你讲的这部分内容并不是具体的知识,而是告诉了你哪些东西要去学习,给了你一张学习地图,把各种知识贯串了起来。
|
||||
|
||||
我曾与朋友打趣道,我的专栏实际上是藏经阁的目录,真正的经书还要等你自己去参悟。只不过,有一个人把这些经书之间的知识连接给你补齐了。这些连接恰恰是在学习相关内容时,让我苦思冥想许久的。
|
||||
|
||||
大约一年前(2018年4月),极客时间编辑找到我,问我是否有兴趣在极客时间开个专栏,作为“得到”重度用户的我,一直对知识服务很感兴趣。有这样的机会让我体验,我当然想试试,甚至最初给自己定下了写100篇的宏伟计划。
|
||||
|
||||
真正开始写,我才知道,在繁忙的日常工作之余,坚持写作还是一件很有挑战的事,今天看来,100篇的目标显得那么无知无畏。
|
||||
|
||||
不过,也正是因为压缩到一半左右的篇幅,在专栏后面的部分,我才极大地提高了知识密度,比如,微服务和DDD,这两个可以分别写成一个系列内容的话题,我用一篇文章就将其精华和知识脉络提炼呈现了出来。
|
||||
|
||||
因为我想尽我所能,帮助大家构建起一个软件开发的知识体系,让你在未来遇到问题时,知道可以在哪个方面进一步加强。希望这个专栏真的起到帮你理清思路,答疑解惑的作用。
|
||||
|
||||
还记得我在开篇词中的最后一段话吗?
|
||||
|
||||
>
|
||||
也许在这个专栏的最后,你发现自己并不认同我的原则,却能够用自己的原则来与我探讨,那么,恭喜你,因为那是最美妙的事情!
|
||||
|
||||
|
||||
不知道你是否形成了自己的原则呢?欢迎与大家分享。因为它代表着你已经形成了自己的知识体系。与我讲了些什么相比,你学到了什么才是一件更重要的事。
|
||||
|
||||
希望在学习了这个专栏之后,你可以用自己的工作原则做更多本质复杂度的事情,减少无意义的时间消耗。
|
||||
|
||||
其实,这个专栏的最大收益人是我自己,感谢这次的专栏之旅,我终于强行治疗了我的拖延症,把自己对于有效工作的思考完整地整理了出来,那些在脑子里模糊的印象现在终于有了一个完整的体系。这个体系就是我在专栏里提到的工作原则,现在我可以更好地表达自己的想法了。
|
||||
|
||||
不过,这个专栏对我而言也是有遗憾的。因为我想表达的内容很多,给大家打开更多大门的同时,也给很多同学留下了更多的疑问。
|
||||
|
||||
有些同学期待在某个方面再深入细节地讲一下,比如,DDD,那可是值得再写一个专栏的主题。限于这个专栏的主题和篇幅关系,我没办法深入展开,只能对大家说声抱歉了。
|
||||
|
||||
如果以后有机会,我会再来与你分享我对软件开发的理解,这次的《10x程序员工作法》之旅就暂告一段落了!
|
||||
|
||||
再见!
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/a8/1a/a89ba340ba096c375c1b84403c78121a.jpg" alt="">](http://jinshuju.net/f/4b8yu2)
|
10
极客时间专栏/10x程序员工作法/结束语/结课测试 | 这些10x程序员工作法的知识你都掌握了吗?.md
Normal file
10
极客时间专栏/10x程序员工作法/结束语/结课测试 | 这些10x程序员工作法的知识你都掌握了吗?.md
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
你好,我是郑晔。
|
||||
|
||||
到这里,《10x程序员工作法》这门课程已经全部结束了。我给你准备了一个结课小测试,来帮助你检验自己的学习效果。
|
||||
|
||||
这套测试题共有 20 道题目,包括13道单选题和7道多选题,满分 100 分,系统自动评分。
|
||||
|
||||
还等什么,点击下面按钮开始测试吧!
|
||||
|
||||
[<img src="https://static001.geekbang.org/resource/image/28/a4/28d1be62669b4f3cc01c36466bf811a4.png" alt="">](http://time.geekbang.org/quiz/intro?act_id=178&exam_id=417)
|
Reference in New Issue
Block a user