【译】我是一个平庸的程序员

原文连接:https://dev.to/sobolevn/i-am-a-mediocre-developer--30hn
复制代码

我我的认为有一些程序员就是天才,他们能够垂手可得地创造一些了不得的软件产品。由于这群天才的存在,咱们对这个行业充满了期待。可是有一个悲伤的事实是:不是每个人都是大师级的程序员。javascript

实际上这就是我,一个平庸的程序员。这篇文章将指导你,做为一个非天才程序员,如何在这个行业中生存。java

我一直用google搜索最简单的技术

我记不住不少东西。好比,标准库里的函数和方法,参数的位置,依赖的包名,样板代码等等。python

因此,我须要用google搜索,天天如此。我也从旧的项目里复用代码,有时也从StackOverflow或者GitHub上复制别人的代码。是的,我是一个面向StackOverflow编程的程序员。程序员

但我不是一我的在战斗,不少不少程序员都像我同样。Ruby on Rails的做者曾经发过一个很火的twitter算法

image

这样子写代码有什么很差呢?有以下几点坏处:docker

  • 你可能从别人那拷贝的,是糟糕的设计或者很烂的代码。
  • 容易造成一个坏的心态:若是不能从网上搜索到你想到的,那么就是“休斯顿,咱们遇到麻烦了”。
  • 若是没有网了,那么你就没法工做了。

可是,我并不认为这是一个大问题。它甚至能够做为你的秘密武器。我有几点建议减轻这些负面影响。编程

生存法则1

  • 使用IDE的代码自动补全和提示,你就不用去搜索语言的基础用法了。
  • 记住你在什么地方或使用什么方法解决了这个问题。下一次遇到一样的问题,找出来看一下就能够了。
  • 你提交到项目中的全部代码,都应该在以后进行分析、重构和评审。这样作,就不会用糟糕的代码下降项目的质量,而是帮助它得到快速的解决方案。

保存事情的简单性

咱们说什么,机器作什么。有时候,机器作了错误的事情,仅仅是由于咱们下了错误的指令。所以软件开发中的主要问题,不是机器,而是开发人员的思惟能力。这种能力是有限的。因此,咱们做为一个平庸的程序员,不要浪费脑子去建立复杂的抽象设计、编写晦涩的算法或不可读的长代码块。保持简单性安全

然而,咱们怎么区分这段代码是简单的仍是复杂的?咱们须要使用WTFs/分钟的方法去衡量代码质量。(译者注:WTF = What the Fu**)bash

image

这条规则很是简单易懂。你发现代码中有一些你看不懂的东西,那它就是复杂的。你应该怎么作?服务器

  • 重写代码,让人看起来清晰
  • 提供文档
  • 在最难懂的地方添加注释。可是记住,过多的注释自己,就是代码的坏味道。(译者注:参见22种代码味道

生存法则2

  • 使用正确的变量名、函数名和类名
  • 确保你代码每一部分只作一件事件
  • 优先使用纯函数,而不是常规函数
  • 优先使用常规函数,而不是类
  • 只在很是必要的状况下,才使用回调

我不相信我本身

一些开发者已经证实他们能提交高质量的代码。像下面这位女神:Margaret Hamilton,阿波罗计划的首席软件工程师。这张图里,她旁边的等身高的纸,就是为登月任务编写的代码。

image

不过,但于我而言,不管我编写任何代码,我不相信我本身。即便是作项目里最简单的部分,我也能把事件搞得很是糟糕,可能包括:

  • 语言错误
  • 逻辑错误
  • 设计错误
  • 演示错误
  • 安全性错误
  • WTF错误(我最喜欢的)

世界上并无一本关于“如何编写无bug代码”的魔法师,因此这些错误都是正常的。全部的软件都有bug,处理掉它就是了。

实际上,任何人都不容许编写带有明显错误的代码。因此至少咱们应该尝试作到这一点。我应该怎样保护我本身的项目呢?下面有几条建议。

生存法则3

  • 编写测试用例,编写大量的测试用例。大到集成测试,小到单元测试。在每次拉取请求前执行CI持续集成,这将减小你的一些逻辑错误。
  • 使用静态数据类型或者可选静态类型。例如,咱们在python中使用mypy,在javascript中使用flow(译者注:如今应该使用Typescript)。这样作的好处是:清晰的设计和编译时类型检查。
  • 使用自动样式检测工具。每种语言都有大量的样式检查工具。
  • 使用质量检测工具。有些工具在你的代码库上运行一些复杂的启发式算法来检测不一样的问题,好比这行内部逻辑太多,不须要这个类,这个函数太复杂。
  • 检阅你的代码。在合并到主分支以前代码,有时候在合并以后也须要review。
  • 花钱让别人审核你的代码。这样作有至关大的好处,由于当别的程序员第一次看你的代码时,很容易看出不一致的地方和糟糕的代码设计。

不该该只在个人电脑上有效

image

差很少十年前,当个人团队开发完第一个大型软件项目时,咱们将其做为java源文件发布。在咱们呈现给客户前的几个小时,它在目标服务器上编译失败了。这算是个大事故。虽然最终咱们修复好了并运行起来,但这是个终身难忘的经历。

这是由于在构建管道里,有着大量的配置和大量的复杂性。咱们没有能力去正确管理该系统的复杂性。从那天开始,为了减小这一步的复杂性,我尝试将程序打包在独立的环境中,并在实际部署以前在此环境中进行测试。

这几年,随着docker(以及通常的容器)的兴起,这件事情开始变得简单起来。docker容许你在彻底相同的独立环境下进行开发、测试和生产上线。采用这种方式,你不会遗留任何重要的事情。

很差吗?说说我本身,在搭建服务、初始化配置或者连接一些东西的时候,我总会遗漏掉一部分。由于有许多东西须要记住。幸运的是,咱们仍然能够实现自动化。有许多很棒的工具能够进行自动化部署。如:terraform, ansible, and packer。查看他们的文档,找到适合你的工具。

我也尝试设置CI/CD进行持续集成和持续部署。当在测试和部署的自动化构建失败时,我会收到报告通知。

生存法则4

  1. 一切使用自动化部署
  2. 使用docker做为开发、测试和生产环境
  3. 使用部署工具

在部署应用后,我仍然不相信我本身

最后,个人应用已经在生产环境上线了,它已经在运行了。我能够打个小盹儿了,什么事儿都不会发生。等一下,不,一切都将崩溃。是的,一切。

实际上,有一些工具能够很容易的发现和修复如今问题。

  1. Sentry. 任何一个你的用户产生异常时,你都会收到通知。Sentry已经支持几乎全部的开发语言。
  2. 各式各样的服务工具,能够将多个程序的日志收集到一个地方。
  3. 服务监控.你能够对CPU、硬盘、网络和存储器配置监控。你甚至能够在用户实际压垮你的服务以前,肯定须要进行服务扩容的时间。

简单来讲,咱们须要在生产环境上进行监控。有的时候你须要上述全部工具,有的时候你只须要一部分。要根据本身的状况进行判断。

持续学习

哇,有好多须要学的东西。但这就是个人生存方式。若是咱们想写好代码,咱们就须要持续学习。成功路上没有捷径,你须要作的就是学习如何一天比一天好。

总结来讲,咱们须要理解两个基本原则:

  1. 每一个人都会遇到问题。最关键的是,咱们对这些问题,准备好了吗,准备到什么程度。
  2. 咱们能够把问题的根源下降到可接受的程度。

这与你的思惟能力或心态无关。

相关文章
相关标签/搜索