## 谈编程
我们来思考一下编程这件事情,哦,我说是编程,而不是打字。
* * * * *
最近突然觉得编程就像是玩游戏,只要遵循游戏的规则就会顺利通过调试。
代码本质就是字符,写代码本质上和打字没有区别,只不过两者遵循的规则不同而已。php 代码要遵循php语言的规则,php执行时要遵循操作系统的规则,操作系统要遵循更底层的硬件运作规则,硬件运作则遵循真实世界的科学规则。
游戏里你去不了地图边界之外的地方,你的所有动作都是游戏提供的,你不可能打出游戏中没有的技能。编程的规则也是如此,应用层无法突破语言层的限制,语言层也无法突破操作系统的限制(漏洞除外),打开文件,申请内存,所有的一切都是操作系统提供的,上层的一切在操作系统层都是透明的,只要老实的遵循系统设定的规则就能玩下去。
无论在哪一层,都有相应的规则,遵守规则,某种意义上就是遵循现实世界中的事物的运作规律。
ps: 程序能绕开操作系统的规则吗?能,没有规则限制可能更灵活,但那样也丧失了很多便利性,操作系统提供的便捷调用可能就无法使用了,开发工作量会增加,毕竟操作系统的本意是做到让你简单可依赖。
----
### 何为编程
**什么是code?**
code就就是一种语言,一种计算机能读懂的语言。计算机是一个傻逼,他理解不了默认两可的任何东西。比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总之,你给他钱,他就给你买回来让你吃到爽的西瓜。但是,你想让计算机买一个西瓜?你要告诉他:去门口的鲜丰水果店买,买沙瓤无子西瓜,若旁边的店打折,就去旁边的店买。总之,你不能让计算机做任何决定,你要清楚的告诉他所有情况下的所有的行为。而code,就是你和计算机交流的语言,或者说是对计算机的命令。
我们就把计算机理解为一个人,这个人很死板,只能按照你给他的详细命令进行工作。而这个人工作速度特别特别快,并且保证工作结果都是正确的。
编程语言其实不重要,重要的是要明白如何和计算机交流,明白了这个也就能看懂代码了。
> 编程 = 算法 + 数据结构
by: [如何教老婆学Python](http://mp.weixin.qq.com/s/FitYuiA9b0xxo8URubg-jw)
----
计算机是多学科交叉的结果,计算机技术很多时候也是这样的,如果掌握的技术多,学习和解决问题时都有直接的好处。甚至有的知识就是依赖的,如果你想学A知识,就一定要先学B知识才行,所以多涉及一些领域,多掌握一些知识总是有好处的。
数据结构 即 数据的存储结构,说清楚了,但还是跟没说一样,那再说的更直白一些:
数据结构 是指 在对 一组数据进行 展示或存储 时的结构定义,这个结构定义包含 数据的 顺序、层级、规则、之间的关系和其他语义等等。
而算法一般是对数据处理的一系列可描述的过程。
计算机技术是 科学和艺术的结合,所以我认为程序员是计算机科学家和艺术家。程序员完成一项软件作品和雕塑艺术家完成一项雕塑品是一样的创作过程,雕塑家用刀精心雕琢艺术品,程序员用代码实现创意,所以他们本质上都是一样的。
所以如果不尊重程序员 就是不尊重科学、亵渎艺术,禁锢创意和想象力。
* * * * *
### 代码本身的意义
代码本身并不重要,它能干什么,怎么干,干得好不好才重要。
换句话说,代码的意义不在于它本身,而是在于怎么写,在于它所表达的思想。作者只是借助代码来表达他想要表达的思想。相当于你说话,你表达的观点才有意义,而不是在于你说话所用的单词。
代码怎么写对我人来说才重要,至于它会被编译成什么,我们无需关心。比如我们写ES6代码,经过Babel编译成浏览器能执行的代码,我们只需要关心我们写的代码就好了,至于这个编译过程,编译后的代码,对我们来说犹如乱码,是不重要的。再次强调,代码怎么写才重要。
任何事情,你都要看到事物的本质什么,coding也是一样,我们需要看到编程的本质,而不只是在电脑前打字。
代码是抽象的思维表达方式,比如编程语言设计者设计的语法,判断,循环等等,这些只是为了帮助我们描述思想。
当代码在CPU层面执行时,就被分解成一个一个的执行单元、指令,宏观上CPU根本就不知道它在干嘛,并不清楚自己在做什么,它只知道傻傻的执行它自己的指令,上游的程序对它来说是不存在的,它只知道它的指令集,而上游也是如此,程序也并不关心CPU做了什么,是怎么完成这个功能的,而我们写的代码就在上层,这中间的抽象,差异化就是编程语言,编译器所要做的事情,所以我们各自做好自己的事情就好了。
当然这中间还有操作系统,操作系统也在中间一层,不过操作系统和编程语言这一层还是有不同。
* * * * *
[神回复:编程到底难在哪里?看懂才是个合格的程序员](https://mp.weixin.qq.com/s/z9p18Bs8bebBjiWPYLmvNw)
而是以买苹果为例说明程序员如何解决问题。程序员需要对问题进行透彻的分析,理清其涉及的所有细节,预测可能发生的所有意外与非意外的情况,列出解决方案的所有步骤,以及对解决方案进行尽量全面的测试。而这些正是编程难的地方。任何一点遗漏都会成为bug,轻则导致挨骂,重则导致经济损失甚至危害安全。
还有要确保代码逻辑的执行符合预期,这样程序才是正确的。
> 写代码的目的是为了不写代码,代码不是越多越好,因为代码是负债,需要持续的维护,代码越多,维护成本越高
这世界上很多事,不是存在即合理的,因为很多人根本不会自己思考,而是盲从麻木的
最好的设计是直接告诉用户是什么,而不是为什么。
跳出语言的枷锁,看到问题本质,找出关键点,深入底层
简单的东西是最好的,因为只有简单才会优美。
如果遇到问题,要么是不细心,要么是即将要掌握一个新的重要的知识点
好代码必须包含以下几点:
清晰,简洁,易读,优雅(实现与使用上),容错性,鲁棒性
*****
### 编程的原则
没错编程也是有原则的。只有当我们统一,遵循一致的原则,世界才会更加美好。
```javascript
// 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。
// 为了在模块内部调用全局变量,必须显式地将其他变量输入模块。
var module1 = (function ($, YAHOO) {
//...
})(jQuery, YAHOO);
```
这种代码见得多吧,试想一下为什么这个自调用结构需要传两个全局变量进去呢?
既然是全局变量在匿名函数里面直接使用不就可以了吗?还要传进去不是多此一举吗?
真的多此一举吗,从代码功能上来说的确是多此一举,不过其实这是有意义的,代码终究是人编写的,所以在长期编写总结中就会有一些实践规律,这就是设计,最佳实践,为了使代码便于理解,维护,所以必须要准守一些设计模式,上面这种形式就是在遵循一种设计模式。
世界上本没有规则和规律,但是总有人去总结实践,这样就有了规律,当所有人都遵循相同的规则,那么沟通的成本就会小很多,世界秩序就会好很多。
试想一下,如果不遵循这种设计模式,**那么这个匿名结构里面随便使用了外部变量,做了什么操作,对全局环境进行了哪些改变或者污染**,我们知道吗,我们根本就不知道,鬼才知道它葫芦里面装的什么药呢,这样我们心里没谱,不放心,**不确定它会不会给我们带来什么未知的伤害**,不信任它。
但是这样通过传参了,它就向我们传达了一种信号,那就是,**我内部是不会随便使用什么的,你尽管放心好了**,你不用管我,看,我就是使用了你传进来的参数啊,这就一目了然了,我对它就放心多了,瞬间就变得亲切了。如果所有代码都遵循这种设计,都循规蹈矩的,那么管理、维护就会很轻松,因为我们知道,**我所想象的就是我所想象的样子**,没有任何多余的必要的担心了。
同理,将使用到的变量提前声明也是这个作用和意义。
**从功能上没有意义,但是意义体现在设计上。**
这就是编程的原则。
补充:编程原则不针对于特定的语言,而是对所有编程语言适用,虽然有些语言有一些奇淫巧技,但是在团队协作时还是要规范,因为团队中的每个人的技术水平都不一样,并且每个人的习惯都不一样,要想融为一体工作效率最大,就必须遵守制定的规范来工作。
(比如PHP里面的抽象类,接口类其实也是这样道理,强制你是用统一的实现,这样保证了代码的规范性)
[函数式编程,真香](https://mp.weixin.qq.com/s/HDOXCMRk_nd59cY9rWXsOQ)
[JavaScript 的 API 设计原则](http://mp.weixin.qq.com/s/8-0O2jQf5pm7XQWjysJKKQ)
> 命名这点事:既要短,又要自描述,最重要的是保持一致性 “在计算机科学界只有两件头疼的事:缓存失效和命名问题” — Phil Karlton 选择一个你喜欢的措辞,然后持续使用。选择一种风格,然后保持这种风格。
[如何写出小而清晰的函数?(JS 版)](https://mp.weixin.qq.com/s/BxH5C_4Dnay7s4e_cwDC6Q)
[如何让你的代码整洁漂亮?](http://mp.weixin.qq.com/s/5fFVtdGUFc7Fo7oKHyejjw)
> “程序员必须为了让人能阅读代码而书写代码,而机器执行只是顺便的。”
[在 css 中什么是好的注释?](https://mp.weixin.qq.com/s/963TnTMNAXstdIPYCTsrqQ)
> 释应该解释“为什么”,而不是“是什么”,即说明原因而不是说明作用(Why, not what)。
[命名规范 · php笔记 · 看云](https://www.kancloud.cn/xiak/php-node/317538)
[苹果 MacPaint 和 QuickDraw 的源代码(2010)](http://mp.weixin.qq.com/s/RFw7JVXWBHmj55BbwaKuWw)
> 在编写 MacPaint 时,Bill 很关注代码的可读性,他说道「这也是一种艺术,和其他艺术形式一样,我花很多时间重构代码,使它们更简洁、更清晰。我坚信, **防止错误最好的方法就是让代码变得更清楚,一眼就知道怎么回事。** 在苹果工作后,我有了这样的转变。如果你想让它变得通顺,必须从头开始重构至少五次」。
[什么是好代码?](http://mp.weixin.qq.com/s/uHcZA_0wvGrRQ3crS90vdw)
[nw.js作者Roger:找到正确方向比怎么做更重要](https://mp.weixin.qq.com/s/1twGepMZShSYBZhXE-_-gQ)
[译文丨为什么做程序员会让我成为一个更好的医生?](https://mp.weixin.qq.com/s/XuKY3RTe-BEqasuuD8WX_g)
[慢公司豆瓣:只要不死,就让我们这样丧着吧](http://mp.weixin.qq.com/s/5-PmKrd-Mbn2DnDd7yYiqg)
> 用优雅的方式去解决问题
[如何提高代码的可维护性_慕课手记](http://www.imooc.com/article/27748)
[3 个盲人程序员](https://mp.weixin.qq.com/s/SSat467sThJxSU7uOjO2rA)
> 语音或盲文并不能描绘出窗口的显示布局。信息以线性方式呈现给我。如果你把网页复制粘贴进记事本,你就能明白我看到的网页是什么样子的。就是剥离大部分格式的多行文本。然而屏幕阅读器可以获取网页上的 HTML 语法,所以我也能知道超链接、标题、表单等等。事实上,如果非复选框元素展示成复选框样式,我并不能知道这是复选框。我之后将写一篇文章详细讲述这些内容,记住我刚刚举的是个“反人类”例子。 (译者注:突然感到自责和羞愧,深深明白了一个道理:不要用各种有含意义的传统标签 hack 布局和样式,也不要因为 css 的强大而懒得使用各种有含义的传统标签。共勉)
>
> 我有众多理由来强烈建议使用整洁统一的代码风格,其中之一就是不要让我的生活变得更加艰难了,好吗。
[中国的盲道上为什么看不见盲人 - 故事FM - 电台节目 - 网易云音乐](https://music.163.com/#/program?id=1370394407&userid=1668400836)
> 每个人都有使用产品的权利,无障碍使用在一开始开发时就要考虑到。
[原来这就是四两拨千斤,这下涨见识了](https://www.365yg.com/a6525240799402131981#mid=5881423966)
> 巨大bug是怎么来的
[Linus 又开怼:有时候标准就是一坨屎!](https://mp.weixin.qq.com/s/je2aNl_S778FEnihudxC2Q)
> 如果标准没有解决实际问题,或者使问题更复杂了,那标准就是一坨屎。
永远没有完美的代码,只有保持更新、保持进步,才能趋于完美。
> 代码的鲁棒性:鲁棒是Robust的音译,也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。比如说,计算机[软件](https://baike.baidu.com/item/%E8%BD%AF%E4%BB%B6)在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。所谓“鲁棒性”,也是指控制系统在一定(结构,大小)的参数[摄动](https://baike.baidu.com/item/%E6%91%84%E5%8A%A8/4777855)下,维持其它某些性能的特性。根据对性能的不同定义,可分为稳定鲁棒性和性能鲁棒性。以[闭环系统](https://baike.baidu.com/item/%E9%97%AD%E7%8E%AF%E7%B3%BB%E7%BB%9F/5993157)的鲁棒性作为目标设计得到的固定控制器称为[鲁棒控制](https://baike.baidu.com/item/%E9%B2%81%E6%A3%92%E6%8E%A7%E5%88%B6)器。
[左耳朵耗子:编程的本质是什么?](https://mp.weixin.qq.com/s/3WKImtdg_rEd_R9eCjs6WA)
[为什么高级程序员总写傻瓜代码以及怎么在一里外识别一个菜鸡程序员](https://mp.weixin.qq.com/s/-bUubfXbU8xYOsQ7L0EkAg)
> 编写傻瓜式代码实际上非常困难,但一旦实现则会带来远超预期的回报。
[程序的腐化](https://mp.weixin.qq.com/s/pa4P4wQvf93l7FGMMKcZPg)
[鲁棒性_百度百科](https://baike.baidu.com/item/%E9%B2%81%E6%A3%92%E6%80%A7/832302?fromtitle=%E9%B2%81%E6%A3%92&fromid=4869534&fr=aladdin)
[程序员的敌人](https://mp.weixin.qq.com/s/QUJ2CMx0VAWJRlDbXOLM9w)
> 软件的不幸在于它创造出来的麻烦多过于它解决的麻烦。真实的情况是,软件只解决了一部分它创造出来的麻烦……
> 「需求」是如此残酷,每天让我和团队尽折腰。你不能回头,你只能向前走,持续探索,不断迭代,找到边界,并突破边界。我想,这也正是做产品的乐趣吧。
[每周分享第 5 期 - 阮一峰的网络日志](http://www.ruanyifeng.com/blog/2018/05/weekly-issue-5.html)
[自下而上的编程](http://www.paulgraham.com/progbot.html),by Paul Graham
> 传统的方法是,一个大型的程序必须分成几块,程序越大,它就越需要分割。你如何划分一个程序?传统的方法称为自上而下的设计:程序的目的是做这七件事,那么我把它分成七个主要的子程序,第一个子程序必须做这四件事,所以它又有四个子程序等等。这个过程一直持续到整个程序具有合适的粒度级别 - 每个部分都足够大,可以做一些实质性的事情,但又足够小,可以被理解为一个单元。
>
> 有经验的Lisp程序员对他们的程序进行不同的划分。除了自上而下的设计之外,他们遵循可称为自下而上设计的原则 - 改变语言以适应问题。在Lisp中,你不仅要将程序写入语言,还要将语言建立在程序上。当你正在编写一个程序时,你可能会想"我希望Lisp有这样一个操作符。" 所以你就去写了。
>
> 当你自下而上工作时,你通常会得到一个不同的程序。你得到的不是一个单一的,整体的程序,而是一个更大的语言、更多的抽象运算符,以及一个更小的程序。
程序的功能单位不宜过大,太大的函数容易掩盖错误,就像一个大城市隐藏着逃犯一样。这样的软件很难阅读,很难测试,也很难调试。(《[自下而上的编程](http://www.paulgraham.com/progbot.html)》,by Paul Graham)
[yii2开发中19条推荐实践(阿北总结)](https://juejin.im/post/5b124627f265da6e16371d42)
> **勿写死,用常量或配置。** 订单状态也可以用这样的方式,不然写成数字ID没有可读性(一些好的开发习惯经验对其它程序也同样有益。)
[程序员的35个坏习惯,你有几条?](https://mp.weixin.qq.com/s/OyYSg5RCRImZujuhpINkEw)
[浅析DDD(领域驱动设计) - 简书](https://www.jianshu.com/p/b6ec06d6b594)
[Redis是如何写代码注释的?(文末有福利)](https://mp.weixin.qq.com/s/vH1QU4JC2D3dUI_OtKQjpw)
[日志消息的5个级别](https://mp.weixin.qq.com/s/GRAvoCLJN6wAolhydB5b3w)
[什么是元编程?](https://mp.weixin.qq.com/s/mXINFf5KkqQGePKywYRpTg)
[谈程序的正确性](http://www.yinwang.org/blog-cn/2015/07/02/program-correctness)
> 符合编码人员预期的就是正确的。
[我发现,我一直是站在巅峰啊!](https://mp.weixin.qq.com/s/HNcIgOD81UkQjbO2pG0dWA)
> 你站得越高,越容易出现难以解决的**抽象泄露**的问题。
> Stack Overflow的创始人Joel Spolsky提出来的一个理论:所有重大的抽象机制在某种程度上都是有泄露的!
[用函数式的方式思考——递归](https://mp.weixin.qq.com/s/6VSxQ0kOnJt9p3ujvxf4mA)
[为什么工程师要了解业务?](https://mp.weixin.qq.com/s/OAJS209R4Aeld4DgEUSnxQ)
[入行 15 年,我还是觉得编程很难](https://mp.weixin.qq.com/s/B7Z0ROkiBqqxVKkLNR9BxQ)
~~~
避开代码完美主义陷阱
在代码质量上精益求精是好事,但也要注意别掉进完美主义的陷阱。因为编程不是艺术创作,不鼓励人们无限度地追求极致。作家大可花上数年打磨一本传世之作,但程序员在代码上钻牛角尖就很有问题。
世间没有完美的代码。大多数时候,你的代码只要能满足当前需求,又为未来扩展留了一些空间就够了。有那么几次,我在简历上看到候选人给自己打着“代码强迫症”标签。隔着屏幕,我虽能感受到 TA 对代码质量的那份重视,但在我心底,其实更期望 TA 早已将完美主义陷阱远远甩在了后头。
不稳定的需求不是程序员的敌人。并且,能否写出易于修改、适配变化的代码,是区分普通程序员和优秀程序员的重要标准之一。
软件开发的核心问题是管理复杂度。失控的复杂度就是程序员最大的敌人。
~~~
[你编写的Java代码是咋跑起来的?](https://mp.weixin.qq.com/s/0Xb-avSLr6QUxxWuhhjbhA)
[千万别用设计模式?](https://mp.weixin.qq.com/s/BfODAn1PUkk1pozKmSA0oA)
[如果现在只能用汇编和Goto编程......](https://mp.weixin.qq.com/s/W6WzTszmiSo9vdglj7TsOw)
[为什么我们不会用简单的方式写代码?](https://mp.weixin.qq.com/s/R0zhhndbvFg8eB2PKSBeJg)
> 正如英国计算机专家 Hoare 所言:软件设计构建有两种方法,一是使其尽可能简单,从而一目了然确定其中不存在缺陷;另一种方法则是使其极为复杂,以至于看不出什么明显的缺陷。
>
> 遗憾的是,他还补充道:第一种方法其实要困难得多。
如果问题很复杂,没有突破口,很可能是因为你没有真正理解所面临的问题是什么。怎么做首先要知道做什么,换句话说,做什么比怎么做更重要。
[当15年的老司机遇到烂项目、烂代码时,他会做这5件事!](https://mp.weixin.qq.com/s/WLWTWxSEnrS_GJI-hDoFdw)
[有这么一个软件大神, 他很少谈论操作系统、网络、高并发、海量用户......](https://mp.weixin.qq.com/s/oQ2JcyP_AU_ck_1TquFLng)
> Martin Fowler给我们的启示就是:实现业务逻辑并不比底层的系统级开发低级,只要善于总结,善于思考,这一领域也大有可为。
~~~
写业务代码是低级编程吗?
计算机本身就是基于科学真理的,并在上面定制了规则,其实按照特有的方式工作。
而编程语言本质上也是基于硬件,计算机规则,和科学真理定制的规则,使用语言编程就需要遵守这些规则,并基于科学真理,有时规则可能本身就是错的,此时还是需要以科学真理为准,因为语言编译器本身可能并不完全可靠,或者说语言本身的局限性,所以编程总是游走于规则和科学真理之间。
这么来看的话,编写业务代码一点也不低级,因为业务就是规则,我们需要理解这些规则,并结合底层规则,还有科学真理来实现最终的功能,本质上这种编程和系统编程没有任何区别,只是工作在不同的层和处理不同的规则而已,大家都是遵从科学真理和各自的规则,本质上没有任何区别,所以不要再说写业务层代码是低级的编程了。产品是技术和业务相结合的。
相反有些时候我认为业务代码比其它编程更加复杂,因为我们需要利用最合适的技术来满足业务,找到最优解并不容易,这需要一些经验和对底层的深度理解,只有这样才能做出一流的产品。
~~~
> 可以看到,数据结构变了之后,实现方法一下子就简单了很多。所以数据结构的重要性是要大于算法的。可以说是数据结构决定了算法。
[“软件教父”又开始整理模式了!](https://mp.weixin.qq.com/s/ILiaR_VKGU8epfkf-eqgcg)
----
[为什么HikariCP是性能最好的数据库连接池?](https://mp.weixin.qq.com/s/1icGvKXfIoygEwD3PreoCw)
> 正是这样一点点微小的优化,凝聚溪流,汇集成河,让HikariCP获得了“光速的”性能,让人佩服,我估计后来者很难超越了吧。事情做到极致
[为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?](https://mp.weixin.qq.com/s/jwgsJnj0V21xAJnBsj_VvA)
> 在此引用 Python 的经典设计格言,格言来源于 Python 但不限于 Python。
>
> 美丽优于丑陋。
> 清楚优于含糊。
> **简单优于复杂。**
> 复杂优于繁琐。
> 平坦优于曲折。
> 宽松优于密集。
> 重要的是可读性。
> **特殊的案例不足以特殊到破坏规则。**
> **尽管实践可以打破真理。**
> **错误却不可置之不理。**
> **除非另有明确要求。**
> **面对模棱两可,拒绝猜测。**
> **总会有一个 —— 最好是只有一个 —— 显而易见的方式来明辨。**
> 哪怕这种方式在开始的时候可能并不明显。
> 现在有比没有好。
> 尽管没有经常好于现在。
> 如果如何实现很难被解释清楚,那么这个想法就是一个坏想法。
> 如果如何实现可以被很好的解释,那么这是一个好想法。
[《黑客英雄》书摘 - 前方的路 - 阮一峰的个人网站](http://www.ruanyifeng.com/road/2010/2010-12-07-hacker.html)
* * * * *
### 编程是一种真正的技术吗
Hacker News 上面,有人问:"新人进入软件行业,应该学什么?"
很多热心人提供建议。有人说:
"你应该好好学习一门语言。精通一门计算机语言,可以让年轻工程师脱颖而出。这不仅对日常工作很有帮助,也有利于以后学习其他语言。学习的东西包括:设计模式、调试、性能、生态系统、标准库等等。"
立刻有人提出相反的建议。
"我建议学习几种彼此非常不同的语言。例如 Java,Go 和 JavaScript。你要学到精通其中每一种语言,能够独立地从头搭建一个新项目,在该语言的生态系统中完成所有开发工作。"
有人举出几种必须掌握的工具。
学习 SQL,你将能够使用任何与数据库相关的软件。
学习 HTML,你将能够创建一个通用的用户界面。
学习 GIT,你将能够与他人分享您的工作。
学习 Unix shell,你将能够部署所有的东西。
不少人赞同这种说法。
"大多数职业(从医生到电工),多年的经验等同于多年的专业知识。但是在软件开发中,技术变化如此之快,你花费了大量时间学习技术和工具,**一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。** 最终,所有这些年,你确实积累了一些一般性的经验,但与具体实施相关的知识,你都不再掌握了。
唯一留下的是那些基本的东西,你应该专注于软件开发的核心知识和数学知识,您的这些技能会不断增长,而不是随着技术潮流的变化而消失。"
我最喜欢的是下面这个建议。
"不要让自己太忙碌。不过,说起来容易做起来难。
我们雇用新毕业的工程师时,会派给他们很多琐碎的工作,使他们饱和。他们会逐渐忘记大学里学到的课程,全部注意力都集中在手头的工作。很多人倾向于通过忙碌程度来评价自己,我相信这是一个死亡陷阱。"
http://www.ruanyifeng.com/blog/2018/09/weekly-issue-24.html
>[danger] 一些项目的大部分代码确实很多部分都是一些实施的细节,算不算真正的技术,因为体现不出任何创造力,没有什么价值。但也有很多有创造性的代码设计,而那些富有创造性的设计就是真正的技术部分。**因为是它具有思想的,而不只是一些简单的实施细节。**
[为什么有些“业余”的能赢。](https://mp.weixin.qq.com/s/8mNPCpvtVdjf94qUkXuiTg) (什么是专业)
> 专业是技术,也是热爱。
*****
### 模块化是走向成功的第一步
任何大规模的东西都是模块化的,手机就是个例子,手机的功能没有局限性是因为可以安装各种软件,这些软件就相当于手机的一个模块。
*****
### 做出真心实意的东西来才是王道
标准有时候就是笑话,过分迷信权威是无知和无能的表现,能做出东西来才是王道,比如css层级关系不要超过几级等,遇到特殊情况要变通,打破常规,这并不是说我们不遵守规范了,而是以另一种方式来解读规范,我们尊崇规范,将它作为指导方向,但我们也不盲目死守规范,不被规范禁锢思维。世界是变幻无穷的,我们也要以“变”来应对。
* * * * *
### 生活中的规则
红路灯就是规则,只有我们每个人都严格遵守交通,才能拥有安全的出行。
要是每个人都横冲直撞,以为马路是自己家的,想怎么开就怎么开,虽说也能通行,但是后果是什么?
所以代码也是一样,随着项目代码量越大,复杂程度也会越来越大,要是大家都随便乱写,虽说也能运行,但是这样面对这样的代码,谁敢动手,大家没有统一的规范,想怎么写就怎么写,一旦发生错误,对整个系统来说都是灾难。
所以在代码的世界里也需要社会中的秩序。
社会中每个人都不是单独的个体,都是协作的。人是群居的。
只有有秩序,才能协作。代码也是一样。
只有大家严格遵守标准、统一的规则,才能劲往一处使,一起愉快的玩耍。
* * * * *
### 编码规范
代码的规范,命名规范,书写规范,语法缩进,语法格式化,是否美观工整,在交给计算机执行时,它并不在乎这些,这对执行性能没有影响,但是一些编码技巧,算法优化可能会对性能有影响,代码给人看时,这些规范才重要。
但是对于一个长期支持的项目,大部分时间需要人维护的,那么规范就很重要了,尤其是团队多人合作的项目,规范更加重要,让规范来约束个人,遵循统一的编码规范,项目的维护才能轻松。
* * * * *
### 协作
编程需要协作,靠一个人是建造不了摩天大楼的。
比如,淘宝基于Java PHP等语言,运行环境基于服务器,操作系统基于Linux,硬件基于别的厂家的,IMB的,电力基于国家电网。而国家电网有基于每一个电网员工,……。
这个社会是一个协作的社会。编程也是这样。
如果没有协作,根本就不会有计算机。
协作就需要沟通,接口,规范,所以其实世界上所有的程序员都影响者彼此,只有大家一起努力,才能提高软件开发的质量,才能共建美好的世界。
[谈开源 · 产品设计 · 看云](https://www.kancloud.cn/xiak/product/482731)
* * * * *
### 编程感悟
编程体会,心得,感悟。
* * * * *
**程序就是数据的流动**
数据总是从一段流向另一端,从一种形态转变另一种形态。(参考浏览器的:Request 和 Response)
* * * * *
**不能忽视代码的健壮性**
体现代码的健壮性的重要的一个点是,程序是否考虑到了所有的可能情况,是否做好了错误处理。比如判断AB两个整数的关系,如果你只判断了大于和小于那就有问题了,因为还会有它们相等的一种情况不能漏掉了,如果你没有考虑全所有的情况,那么这个代码就不健壮,测试时你可能测试不出来这些问题,看起来不会有问题,可是在运行过程中可能由此产生一些不可预料的后果,甚至难以排查的bug。
>[danger] **凡事有可能失败的地方,就一定会发生失败,所以检测、容错性要做好,不能偷懒!**
[图解冒泡排序](http://mp.weixin.qq.com/s/3eW3RMka1dlniLRQp7Sa2w)
> **算法的稳定性:** 那这个算法稳不稳定呢?(扩展阅读:**边界检查**)
* * * * *
**事物运行的本质**
![](http://cdn.aipin100.cn/17-12-25/90418249.jpg)
计算机并不是百分百和我们的预期一致,你得明白计算机的工作方式,比如循环,每隔一秒钟休眠一下,你以为每隔一秒钟运行一次,但实际情况可能是一秒多一点,至于这个误差多大也说不定,要看当前计算的负载,进程的调度。所以我们的代码通常只是理论上按照我们写的那样运行,我们的预期其实只是理论上的,你还要了解本质才行。
* * * * *
### 项目开发的一般流程
1. 应用场景
2. 分析问题
3. 整理需求
4. 编写原型
5. 测试
6. 投入生产使用
7. 不断修复问题,完善功能,迭代需求
8. 稳定运行
9. 形成通用、灵活、成熟的解决方案
10. 维护、升级、更新、社区、开源……
*****
### 扩展
文中代码部分引自 [阮老师](http://www.ruanyifeng.com/blog)的文章:[Javascript模块化编程(一):模块的写法](http://www.ruanyifeng.com/blog/2012/10/javascript_module.html)
[好程序员:中国程序员 最厉害的是什么水平](https://www.toutiao.com/a6480371150525301262/?tt_from=weixin&utm_campaign=client_share×tamp=1515662955&app=news_article&utm_source=weixin&iid=22069500288&utm_medium=toutiao_android&wxshare_count=1)
> 求伯君自己认为:程序之间,没有什么好比的,殊途同归,各种功能最后大家都能实现。成者为王。“程序有两种风格,**一种写得规范,大家都看得懂**;**一种不规范,短小精悍**,几条指令就能完成一个应用,讲究速度。”求伯君认为自己属于后一种。
>
> “现在程序都很庞大,以光盘为单位。没有合作精神,一个人做不出什么好软件。我们当时单枪匹马可以成英雄,现在已经不行了。(**而团队合作就需要规范,所以求伯君的单枪匹马已经不适应这个时代了**)
[Swoole · php笔记 · 看云](https://www.kancloud.cn/xiak/php-node/346847)
[yangweijie/clean-code-php: Clean Code concepts adapted for PHP](https://github.com/yangweijie/clean-code-php)
[为什么 Web 前端开发不抛弃 HTML 和 CSS,用纯 JavaScript 开发? - 知乎](https://www.zhihu.com/question/21445727)
> HTML/CSS 都是声明式的(声明式、定义式编程)
[命令式编程 vs 声明式编程](https://mp.weixin.qq.com/s/UbF__kil0nhiFrhWevMV-A)
> 命令式编程就是对硬件操作的抽象, 程序员需要通过指令,精确的告诉计算机干什么事情。
> 声明性是函数式编程的一个重要特点
----
last update:2018-1-19 03:09:08
- 开始
- 公益
- 更好的使用看云
- 推荐书单
- 优秀资源整理
- 技术文章写作规范
- SublimeText - 编码利器
- PSR-0/PSR-4命名标准
- php的多进程实验分析
- 高级PHP
- 进程
- 信号
- 事件
- IO模型
- 同步、异步
- socket
- Swoole
- PHP扩展
- Composer
- easyswoole
- php多线程
- 守护程序
- 文件锁
- s-socket
- aphp
- 队列&并发
- 队列
- 讲个故事
- 如何最大效率的问题
- 访问式的web服务(一)
- 访问式的web服务(二)
- 请求
- 浏览器访问阻塞问题
- Swoole
- 你必须理解的计算机核心概念 - 码农翻身
- CPU阿甘 - 码农翻身
- 异步通知,那我要怎么通知你啊?
- 实时操作系统
- 深入实时 Linux
- Redis 实现队列
- redis与队列
- 定时-时钟-阻塞
- 计算机的生命
- 多进程/多线程
- 进程通信
- 拜占庭将军问题深入探讨
- JAVA CAS原理深度分析
- 队列的思考
- 走进并发的世界
- 锁
- 事务笔记
- 并发问题带来的后果
- 为什么说乐观锁是安全的
- 内存锁与内存事务 - 刘小兵2014
- 加锁还是不加锁,这是一个问题 - 码农翻身
- 编程世界的那把锁 - 码农翻身
- 如何保证万无一失
- 传统事务与柔性事务
- 大白话搞懂什么是同步/异步/阻塞/非阻塞
- redis实现锁
- 浅谈mysql事务
- PHP异常
- php错误
- 文件加载
- 路由与伪静态
- URL模式之分析
- 字符串处理
- 正则表达式
- 数组合并与+
- 文件上传
- 常用验证与过滤
- 记录
- 趣图
- foreach需要注意的问题
- Discuz!笔记
- 程序设计思维
- 抽象与具体
- 配置
- 关于如何学习的思考
- 编程思维
- 谈编程
- 如何安全的修改对象
- 临时
- 临时笔记
- 透过问题看本质
- 程序后门
- 边界检查
- session
- 安全
- 王垠
- 第三方数据接口
- 验证码问题
- 还是少不了虚拟机
- 程序员如何谈恋爱
- 程序员为什么要一直改BUG,为什么不能一次性把代码写好?
- 碎碎念
- 算法
- 实用代码
- 相对私密与绝对私密
- 学习目标
- 随记
- 编程小知识
- foo
- 落盘
- URL编码的思考
- 字符编码
- Elasticsearch
- TCP-IP协议
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依赖注入
- 开发笔记
- 经纬度格式转换
- php时区问题
- 解决本地开发时调用远程AIP跨域问题
- 后期静态绑定
- 谈tp的跳转提示页面
- 无限分类问题
- 生成微缩图
- MVC名词
- MVC架构
- 也许模块不是唯一的答案
- 哈希算法
- 开发后台
- 软件设计架构
- mysql表字段设计
- 上传表如何设计
- 二开心得
- awesomes-tables
- 安全的代码部署
- 微信开发笔记
- 账户授权相关
- 小程序获取是否关注其公众号
- 支付相关
- 提交订单
- 微信支付笔记
- 支付接口笔记
- 支付中心开发
- 下单与支付
- 支付流程设计
- 订单与支付设计
- 敏感操作验证
- 排序设计
- 代码的运行环境
- 搜索关键字的显示处理
- 接口异步更新ip信息
- 图片处理
- 项目搭建
- 阅读文档的新方式
- mysql_insert_id并发问题思考
- 行锁注意事项
- 细节注意
- 如何处理用户的输入
- 不可见的字符
- 抽奖
- 时间处理
- 应用开发实战
- python 学习记录
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文档相似度验证
- thinkphp5.0数据库与模型的研究
- workerman进程管理
- workerman网络分析
- java学习记录
- docker
- 笔记
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京东
- pc_detailpage_wareBusiness
- doc
- 电商网站设计
- iwebshop
- 商品规格分析
- 商品属性分析
- tpshop
- 商品规格分析
- 商品属性分析
- 电商表设计
- 设计记录
- 优惠券
- 生成唯一订单号
- 购物车技术
- 分类与类型
- 微信登录与绑定
- 京东到家库存系统架构设计
- crmeb
- 命名规范
- Nginx https配置
- 关于人工智能
- 从人的思考方式到二叉树
- 架构
- 今日有感
- 文章保存
- 安全背后: 浏览器是如何校验证书的
- 避不开的分布式事务
- devops自动化运维、部署、测试的最后一公里 —— ApiFox 云时代的接口管理工具
- 找到自己今生要做的事
- 自动化生活
- 开源与浆果
- Apifox: API 接口自动化测试指南