假如我是一行代码

前言

一直以来很想写这样的一篇文章,奈何对这个论题的理解一直停滞不前,理解的也不够透彻。今天偶然的一个想法,综合自己的工作经历和项目经验,突然找到了灵感,现在,为大家带来这篇文章。

绪论

故事应该从麦肯锡公司的金字塔原则谈起,我们都知道,麦肯锡公司的金字塔原则教给我们的是重点突出、逻辑清晰、主次分明的逻辑思路,也就是告诉我们一种从金字塔塔尖逐渐向下推演的过程,至于,金字塔原理的详细内容,在此就不做赘述了。其实大家可以发现,金字塔原理是很符合我们的思维习惯的,这里面又涉及到一种重要的思维方式,那就是推演。而大部分人的这项能力其实和一般人别无二致。但是,反向的思维,比如说归纳又有多少人能够熟练掌握呢?大多数人程序设计,往往从架构基本概念入手,不断向下挖掘,不断的推演,当然有时候会辅以头脑风暴,效果更佳。但我们今天,就从一行小小的代码谈起,刷新一下我们的认知!

假如我是一行代码

为何这样想?

我们不止一次在生活中听到”假如我怎样怎样,我会怎样怎样“的句式,而这样的句式说出来的一般意义无非就是让我们站在另一个角度去思考问题,比如说曾经一个物理学家假设自己是一个电子,他借着这样的假设进入了另外一个神奇的天地,那是一片从来没有人到达的乐土,那是一个就算两个电子相撞、抑或相互泯灭都显得举足轻重的一个世界,在那里,电子是主宰,而不再是人类。电子遵循着生存的法则,相安无事。而我们,今天的主题,将带着大家以一种全新的思维去看待程序设计,假如我是一行代码!

站在一个软件工程师的角度,我们往往觉得一行代码对于我们的影响是微乎其微的,可以忽略不记,而今天,当我们假想自己是一个代码块的时候,我们可能会发现另一个世界。但是有人提出质疑了,那你为何不假想自己是一个关键字,是一个字母,是一个字节或者一个比特位呢,莫急,且听我慢慢道来,我们今天讨论的程序设计,我认为实用的有讨论意义的单位最小就是一行代码了,再小的话,将失去我们讨论的价值所在。当然,换个角度来讲,如果你想探究cpu内部的加、减、乘、除的机理,你选一行代码作为参考自然是不够的,那个时候,字节等量级的参考才是我们真正所需。

那么,让我们开始思考,假如我们是一行代码,我们会怎么思考呢?文字有时候还是显得太枯燥了,我们来张脑图天马行空一下。

可以清楚的看到,作为一行代码真的还是不错的,有这麽多的事情可以干,哈哈。当然,我着重标出来的1和2大家一看都知道这两个老梗,不懂的自行谷歌之。

当然了,我们并介意那些天马行空的想法,但是在想这些事之前还是先把我们最主要的事情先做好吧,那当然就是我们的程序设计啦!现在,我们就确立一下我这行代码现在想的问题,那就是如何写出一段好的程序,下面的话,让我们进入今天的主题,主题,主题。

我要怎么做?

上面我们已经谈到了我们为何要这样去思考问题,我们争取站在一行代码的角度去理解软件设计这门艺术,那么,作为一行代码的我们,现在已经确立了这样的一个宏伟的目标。我们现在站在这样一个难题面前,想着如何去攻克它,证明我们自己的实力,似乎现在已经到了一种剑拔弩张的状态,空气里到处都充斥着火药的味道。

但是作为一行聪明的代码,我不能蛮干啊,我一定得先在心里有一个想法,然后去扩充它,由于我所处的层次是比较低的,我只能就一点点的思考了,大家可不要笑话我这行代码啦!思考的结果我该以什么样的形式呈现给大家呢?苦思冥想之下突然发现作为一行优秀的代码,todoList一定是要有的,于是就有了我下面的思考。于是就有了下面的列表:

  1. 首先当然是拉拢几大程序设计结构,if-while-for他们了,这样一来,我军士气大涨。

2.拉来测试大神“junit”为我们代码质量保驾护航。

3:找一些敌军的优秀精神领袖,观察其处事风格,正所谓知己知彼,百战不殆!(当然具体的寻找思路就是GitHub喽!)

4:链接一些api大哥,为我们的一些底层操作实现无缝接入。

5:请教算法大师,为我等思维模式的提高锦上添花。

6:拜访设计模式,了解高可用软件开发之道。

列完了这些,我苦思冥想,接下来该干什么呢?作为一行有着完美主义血统的代码,我忍受不了自己的todolist不完善,然而我却忘记了,完美不存在,我们只是能尽量做得完美而已。下面的事情,还用我多说吗?那当然就是个”做“;当然,我们开始的话就要分析一下我们的todolist中计划可行性。

首先,我们大致将其分为两类,受外部影响的和内部可消化的。

类别 计划编号
受外部影响 1,4
内部可消化 2,3,5,6

大家觉得是哪一项更加重要呢?当然,是受外部影响的重要啦!在这里的话,以计划4说明下:

几个月前,一名NPM(NodejsPackageManager)社区的贡献者AzerKo?ulu出于对NPM管理层的怨愤(详情),不声不响删除了自己在NPM上面的全部代码,其中就包含只有11行代码的“Left-pad”,没想到从中国北京 到美国硅谷,从大学宿舍学习Nodejs的新手到Facebook的资深工程师,整个互联网界都炸开了锅,他们手中的许多Nodejs模块,全罢工了。

据NPM官方博客,“left-pad”删除后, 受到影响的模块达到数千个。

这可真是我代码界的前辈啊,但是这是一个典型的反面教材,有人就质疑了,为什么不设计一个官方标准库,把那些引用次数很多的api都放进去呢,(这一点上,jdk就做的比较好)还有一个更典型的例子,真有一个一行代码的模块,叫做isArray,下载量达到88万次,万一有一天,代码拥有者的账号被黑客盗走了,黑客一时兴起,删了这个小模块,到时候真可就是呜呼哀哉了!

这说明了一个道理,外部模块有风险,且用且谨慎。在举个例子,你要开发一个项目,请了好几个大神,大神也答应你好的,结果真到交付的时候,大神说最近没时间,还没开始干,这时候,有着一颗玻璃心的我,岂不是要抓狂,在加上我们代码界又都是一些耿直boy,有啥事会发生还真别说不来,就像上面node社区的那位小哥!so,首先确认外部的风险点,保证项目进度可控。

做完了todolist,也确认了外部的风险点,接下来该干嘛呢?哼,让我好好想想,该干嘛呢?突然灵机一动的我都被自己机智到了,当然是确认验收标准,什么才算的上是一段好的代码呢?我们在开发的过程中也一定是在有着明确的验收标准后才会开始的,要不你怎么知道什么时候该停下来!如果不知道什么时候停下来,就像递归没有终止条件,到最后你只会因为资源耗尽而亡,就像遇见了程序里面的栈溢出。那么,我们就来定义下,当然,我希望我们友谊的小船能升级为巨轮,会尽量写好的,列举如下:

项目 标准
1 人脑可阅读(代码不仅是写给机器的)
2 直线化的思维(方便理解)
3 完善的注释
4 优化,但却不能过早优化
5 可测试并且已经测试
6 可维护的
7 和业务相关的

当然,不同的项目有着自己不同的项目标准,而我们这里仅仅是一点好代码的验收标准,当然,若有不妥之处,还望指正。有了这些,我们就要开始动手了,想想也激动。

于是我们进入了正式的开发编码,能一直编码的话那也真是人生一件乐事啊,正当我们激情满满的时候,产品小姑娘跑过来,这有几个需求需要改一下,顿时有莫有觉得心好累啊!但是不怕,我们设计的巧妙的结构还是足以容纳这一点的改动的。看吧,前期规划的重要性,于是乎,一切好像都向着美好的方向在发展着,我们的小心脏也可以放下来了。似乎马上就要成功的到达彼岸了。终于开发完了,自己完成简单的自测之后,觉得这样的小模块提测不会有问题的啦,然而,我们还是想多了,还是有着这样那样的问题,最终,我们的小模块终于上线了,而我们学到了什么呢?从一行代码的角度思考,我们又能学到什么?

我们得到的启示

为了更直观的看到我们得到的启示,我们来试着将我们的思考过程以图表的形式呈现出来。

看到上面的图表,我们的思路是不是更加清晰了一点呢?我们把这幅图倒着来看,俨然就是一张倒着的金字塔,而不同的是,我们这次是从塔底向塔的最上方爬,也就是采取归纳的方法,一步步的向我们的目标靠近,这是一种逆向的思维,同时也是对我们思维方式的一种锻炼和提升,我们常规的编码就是站在一个比较高的角度上去思考,去进行脑暴,把我们需要考虑到的点归纳进来,从而实现我们todolist的完整性。最终为我们的这一段可验收的代码贡献自己的力量。从这里我们还可以联系一点,那就是当你站在一个比较高的层次的时候,也要去考虑底层运行的机理,比如说在项目管理的过程中,身为项目经理,一般都是从技术岗位一步步的干上来的,所以在思考问题的时候,会站在底层开发人员的角度去思考,而如果这个经理非技术出身,那么他在进行项目管理的时候就会想当然的站在自己的角度去进行思考,忽略一些细节,往往这样的项目,开发人员累死累活,却没有什么成果!我们不该想想背后的原因吗?

在本文我们可以看到,推演和归纳的思想在我们项目进行的过程中,构建一段普适性高的代码的时候,扮演着非常重要的作用,当你站在一个较低的层面的时候,你可能会看到不一样的世界,一句打印的代码在那个世界里也可能举足轻重,而你,收获的不仅是归纳的思维,在现实生活中,还可能收获的是理解和尊重。


时间: 2024-10-09 19:02:27

假如我是一行代码的相关文章

CSDN日报20170310——《假如我是一行代码》

[程序人生]假如我是一行代码 作者:henry-hacker 我们不止一次在生活中听到"假如我怎样怎样,我会怎样怎样"的句式,而这样的句式说出来的一般意义无非就是让我们站在另一个角度去思考问题,比如说曾经一个物理学家假设自己是一个电子,他借着这样的假设进入了另外一个神奇的天地,那是一片从来没有人到达的乐土,那是一个就算两个电子相撞.抑或相互泯灭都显得举足轻重的一个世界,在那里,电子是主宰,而不再是人类.电子遵循着生存的法则,相安无事.而我们,今天的主题,将带着大家以一种全新的思维去看待

一行代码解析复杂JSON文件:利用Android自带的包解析JSON

上周写了一篇关于Android自带的org.JSON与JSONLIB相冲突的文章,今天我想写一下我对org.json使用的小心得 由于学校项目要求解析一个复杂JSON,所以就上网搜了一下,不过Google一搜JSON数据解析,会出现五花八门的结果,JSONLIB, GSON, FASTJSON等等,唯独没有对org.json的使用,其实Android自带的JSON解析包相当好用,其用法与JSONLIB类似,我是先用的JSONLIB,在JRE环境下用得好好的,到了Android下怎么都跑不通(原来

牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题

春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的. 学会了一行代码解决,以后遇到面试官问起的话,就可以装逼了. 一.2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 n 被整除成 1 . 我们可以把 n 拆成二进制看待处理的,如果 n 是 2 的幂次方的话,那么 n 的

一行代码解决IE兼容性问题

在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html><html xmlns=http://www.w3.org/1999/xhtml xmlns:bd=http://www.baidu.com/2010/xbdml>;<head><meta http-equiv=Content-Type content="text/h

一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 http://www.jb51.net/css/383986.html

在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 复制代码 代码如下: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml xmlns:bd=http://www.baidu.com/2010/xbdml>; <head> <meta http-equiv=Content-Type conten

怎么用一行代码解决CSS各种IE各种兼容问题

用一行代码来解决CSS在,IE6,IE7,IE8,IE9,IE10 中的各种兼容性问题. 在网站前端写代码的过程中,很多时间IE各个版本的兼容问题很难整.现在百度与谷歌都有了一行解决这种兼容性的代码了.如下面的. 办法一 百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 1 <!Doctype html> 2 <htmlxmlns=http://www.w3.org/1999/xhtmlxmlns:bd=http://www.baidu.com/2010/xbdml> 3 

有一个NSStirng类型,retain方式声明的name属性的setter方法内部每一行代码的作用?

- (void)setName:(NSString *)name { 判断原有对象和新对象是否是同一个对象,如果是同一个,就没有必要再重新赋值,否则会先release 再retain,就会变成野指针 if (_name != name) { 释放保有之前对象的所有权 [_name release]; 让实例变量 _name保有新的对象的所有权 _name = [name retain]; } } 有一个NSStirng类型,retain方式声明的name属性的setter方法内部每一行代码的作用

C++ - 删除文本的最后一行 代码(C++)

删除文本的最后一行 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 读取文本的每行("\n"), 存储入数组vector<string>, 输出时, 少输出最后一行, 即可. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <windows.h> #include <fstream&g

一行代码的快速排序

1.一维高斯函数: a表示得到曲线的高度,b是指曲线在x轴的中心,c指width(与半峰全宽有关),图形如下: . 2.根据一维高斯函数,可以推导得到二维高斯函数: 在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小. 计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值.常用作图像平滑操作. 例如:通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果. &q