写点什么

成为伟大程序员的 -10- 个要点

用户头像
Android架构
关注
发布于: 9 小时前

一切都是如此。“低价”是我们用一种草率的方式来实现某些东西而获得的快速胜利。

4.软件应该是确定性的。这就是要瞄准的目标!

在理想化的世界中,软件中的一切都应该是“确定性的”。我们都应该是函数式程序员,编写没有副作用的纯粹的函数。如String.contains()。无论执行以下操作多少次:


<pre class="hljs swift" style="margin: 15px auto; padding: 10px 15px; display: block; overflow-x: auto; color: rgb(51, 51, 51); background: rgb(251, 251, 251); word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; font: 400 12px/20px "courier new"; border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">assertTrue("abcde".contains("bc"));</pre>


…结果总是相同的,都是预期的结果。哪怕宇宙爆炸对这一计算也没有影响。这是确定性的。


我们也可以在我们自己的程序中,而不仅仅是在标准库中做到这一目标。我们可以尝试尽可能多地编写无副作用的确定性模块。这真的与我们选择什么技术无关。确定性编程可以用任何语言完成——即使函数语言有更多工具也可以通过更复杂的类型系统来防止意外的副作用。但是我所示的例子是一个 Java 示例。对象方向允许确定性。对的,像 PL / SQL 这样的程序语言允许确定性。如果要在索引中使用函数,那么需要请求确定性的函数:


<pre class="hljs sql" style="margin: 15px auto; padding: 10px 15px; display: block; overflow-x: auto; color: rgb(51, 51, 51); background: rgb(251, 251, 251); word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; font: 400 12px/20px "courier new"; border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">CREATE INDEX upper_first_name ON customer (upper (first_name));</pre>


<pre class="hljs php" style="margin: 15px auto; padding: 10px 15px; display: block; overflow-x: auto; color: rgb(51, 51, 51); background: rgb(251, 251, 251); word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; font: 400 12px/20px "courier new"; border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">-- Deterministic function here: -----------^^^^^^^^^^^^^^^^^^</pre>


这又是一个规则问题。有副作用的过程/方法/“函数”是为“破窗户”。有副作用也许会更容易维护,当然希望最终可以消灭副作用。但这通常是自己骗自己。当将来的某一天意外突现的时候,就是你付出昂贵代价的时候。别不相信,说曹操曹操就到。

5.接受意料之外的事情

程序员始终应该遵守墨菲定律。一切都可能被打破。并且它即将被打破。作为软件工程师,我们应该谨记它是会破掉的。因为我们的世界是不确定的,所以我们正在实现的业务需求也是不确定的。我们只有在终于能够确定的时候,才能实现技巧 #4(确定论)。否则,我们将不可避免地进入不确定论的世界(也就是“现实世界”),即一个将会出错的世界。所以,要以此为基础。接受意料之外的事情。训练你内心的洪荒之力,从积极的角度预见各种麻烦。


当然,如何以简洁的方式写代码来预见各种麻烦就是另一个故事了。如何从那些可能会失败的东西(因此不需要处理)中辨别那些将会失败的东西(因此需要处理),还是需要通过一些实践滴。

6.不要货物崇拜。不要教条主义。始终具体情况具体对待。

所有教给你的内容都存在潜在的错误。即使是那些流行语。引用一句很不错的话:


“我的职业生涯至少有 50%是为了帮助或解脱由教条主义引发的一个个灾难。


我们的职业充满了虚假。我们喜欢把自己当作数学家,坚持最纯粹的思想,认为它们一定是正确的。


那是一条歧路。我们的职业构建在数学的基础之上,但除非你进入范畴论或关系代数的时髦世界(即便你真的进入,我也怀疑一切是否是“正确的”),否则你就得面对现实世界务实的业务需求。好吧,坦率地说,这离完美还有十万八千里。让我们来看看一些最流行的编程语言:


  • C

  • Java

  • SQL


你真的觉得这些语言一点都不像数学吗?行,不如我们先来讨论段错误,Java 泛型和 SQL 三值逻辑。这些语言是由实用主义者建立的平台。所有这些都有一些非常酷的理论背景,但最终,还是有了这些工具。


对于建立在语言之上的所有东西也是如此:库,框架,设计模式,甚至架构。没有什么是对的或是错的。一切都是为某些上下文设计的工具。想想在其上下文中的工具。永远不要把这个工具当成一个独立的理由。我们不是“为艺术而艺术”。


所以对这些质疑说不:


  • XML

  • JSON

  • 功能编程

  • 面向对象编程

  • 设计模式

  • 微服务

  • 三层架构

  • DDD

  • TDD

  • 实际上:*DD

  • 不胜枚举


所有这些都是某些给定上下文的好工具,但并不总是如此,要学会具体情况具体对待。保持好奇心,开发创造力,知道何时才需要使用这些工具,将有助于你成为一个更优秀的程序员。

7.就是干

这是真理。话说,总有一些牛人出类拔萃,能够傲视群雄,让人鞭长莫及。


但大多数程序员只达到“好”的级别,或是有潜力达到“好”的程度。那么怎么才能成为一名好的程序员呢?正如罗马不是一天建成的,伟大的软件也不是一天可以写成的,受欢迎的人并非我们这个时代唯一的英雄。我遇到过许多默默无闻但伟大的程序员,他们孜孜不倦地攻克软件难题,解决了许多小公司隐蔽的问题。


伟大的程序员都有一个共同点:遇到问题就是干。练习,实践。每天都致力于工作与学习,然后变得越来越优秀。


想要更擅长 SQL?那就干吧!每天都尝试用一些新功能编写一个 SQL 语句。使用 window functions。分组。递归。分区的外连接。MODEL 和/或 MATCH_RECOGNIZE 子句。不需要每次都交付生产,就是为了实践。这些都是有价值的。

8.专注一个主题(从长远的角度)

可能只有很少一部分“优秀的”全栈开发人员独领风骚。事实上,大多数全栈开发人员都将位于中间水平。当然,一个小团队可能只需要几个全栈开发人员,就可以涵盖很多业务逻辑,快速推出一个新的软件。但是,软件将非常笨拙,“马马虎虎能工作”。也许这对于只要可行即可的产品阶段来说就已足够,但从长远来看,会导致全栈开发人员将没有时间来正确分析(或预见!)更复杂的问题。


主要专注一个主题,并真正擅长这个方面。真金不怕火来炼,只要你有本事,那么走到哪里都需要。所以,致力于你的职业生涯,做一些真正好的东西,而不是“差不多就行”。

9.涉猎广泛

虽然你应该主要关注一个主题,但不应该完全遗忘其他方面。你永远不能马上真正擅长 SQL、扩大、扩展、低级性能、CSS、面向对象、需求工程、架构等等的所有内容(见技巧 #8)。这是不可能的。


但你至少应该明白它们每一个的本质。你需要明白何时 SQL 是正确选择(以及何时不是)。何时低级别性能的调整很重要(何时不是)。CSS 原则上如何工作。面向对象、FP 优点。等等。


你应该花一些时间涉猎这些(以及更多)概念和技术,以便更好地了解它们的重要性。知道何时应用它们,然后再找专业人士来实际执行工作。


涉猎新的范式和技术,有助于你用全然不同的思维方式思考,可能你会在以后的日常工作中不自觉地以某种方式用到它们。

10.保持简单,傻瓜式

爱因斯坦曾说:


“Everything should be made as simple as possible, but no simpler.”(“任何事情都应该尽可能简化,直到没法再简化为止。”)


没有人能够处理巨大的复杂性。在软件中不能,在生活的任何其他方面也不能。复杂性是好软件的杀手,因此简单性是使能者。易于明白。难于实现。你需要大量时间和实践才能识别和生产出简单。当然,你可以遵循许多规则来实现简单化。


最简单的规则之一就是使用只有几个参数的方法/函数。让我们来看看吧。前面提到的String.contains()方法就是如此。我们可以写”abcde”.contains(“bcd”),不阅读任何文档,每个人都能立即了解这做什么以及为什么。该方法做了一件事情,并且只做这一件。没有复杂的上下文/设置/其他传递给该方法的参数。没有“特殊情况”,也没有任何警告。


此外,在库中简化比在业务逻辑中要简单得多。那么我们能实现吗?也许吧。通过实践。通过重构。但像伟大的软件一样,简单性也不是一天可以搞定的。


(高级技巧:应用康威定律。在一个业务超级复杂的环境中编写又好又简单的软件是完全不可能的。要么你选择复杂性和丑陋,要么你最好摆脱那个业务)。


<ins class="adsbygoogle" data-ad-client="ca-pub-3171310320403916" data-ad-slot="5138981789" data-adsbygoogle-status="done" style="display: inline-block; width: 336px; height: 0px;"><ins id="aswift_0_expand" style="display: inline-table; border: none; height: 0px; margin: 0px; padding: 0px; position: relative; visibility: visible; width: 336px; background-color: transparent;"><ins id="aswift_0_anchor" style="display: block; border: none; height: 0px; margin: 0px; padding: 0px; position: relative; visibility: visible; width: 336px; background-color: transparent; overflow: hidden; opacity: 0;"><iframe width="336" height="280" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left: 0px; position: absolute; top: 0px; border: 0px; width: 336px; height: 280px;"></iframe></ins></ins></ins>


译文链接:http://www.codeceo.com/article/10-tips-be-great-programmer.html

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
成为伟大程序员的-10-个要点