|
技术的浪潮奔腾不息,浪潮退去之后,留给我们自己的是方法论?还是过时的技术?
----
我们程序员,总喜欢谈论所谓“35岁魔咒”,好像“35岁魔咒”成了程序员的专利。然而事实上,35岁,是各行各业的职场人都会面临的问题。
究其根本,35岁是人到中年的转折点,如果我们在工作中的价值产出,更多依靠体力,那么就势必面临职业发展开始走下坡路的困境。
编程,原本是一种极富创造力,重视抽象思维与逻辑推演的工作,但我们相当一部分人,把编程做的像事务性工作,平淡如水,如果这样,“35岁魔咒”就会困扰我们。
在一个社会群体中,不同的人有不同的选择,我无意也无法改变大的环境,但希望帮助有意愿与“35岁魔咒”斗争的程序员,找到一点方向,多干几年!
从一道面试题说起
杨辉三角是我在面试中经常会问的一个问题,”请编程,按照指定格式输出前N行的杨辉三角"。

大部分候选人,拿到问题之后,就开始编码,首先写一个两层的循环,然后开始思考循环的终止条件,经过一番思考,给出一个自己都不相信的答案。我印象比较深刻的一次,候选人来自微信支付,也仅给出了获取前N行数据的方法,仍然未能找到按照指定格式打印的方法。
很多人会说,离开学校好几年了,算法早都忘记了,这种问题应该去问校招的同学。我不以为然,我在意的不是一个具体的算法,而是分析和解决问题的思路。我们可以忘记一些具体的算法,但忘记的同时,应该把算法中蕴含的解决问题的思路内化成自己的武器。
接下来,我和大家介绍下我如何看待这个问题。
图灵奖得主N.Wirth提出"程序 = 算法 + 数据结构",我更习惯说“程序 = 数据 + 过程”。
数据视角
首先,我们站在数据的视角,来审视这道面试题,可以发现:
1、可以使用二维数组(以php语言为例)描述杨辉三角的前N行数据
[
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
]
2、行的数据之间,存在如下规则:
1)每行两边数字恒为1
2)每行中间的数字,是上一行交叉位置两个数字的和

因此,可以用一个伪代码描述这种关系:
F(1) = [1]
F(N) = [
1,
F(N-1)[0] + F(N-1)[1],
F(N-1)[1] + F(N-1)[2],
...,
F(N-1)[N-2] + F(N-1)[N - 1],
1
]
过程视角
接下来,我们站在过程视角,审视这道面试题。首先,它的过程可以分为两个步骤:1)获取前N行杨辉三角的数据;2)按照图示对齐的方式进行打印。
第一步,基于我们前面对数据的分析,可以轻易的得出对应的方法设计:
function yanghui_datas($n); // 获取前N行杨辉三角数据
function yanghui_line_datas($prev_line_data); // 依据前一行数据获取下一行数据
第二步,依据图示对齐方式进行打印。单纯的打印是很简单的,所以,关键在于“对齐”。
解决对齐的方法,无非就是给相应的位置留白。但我们发现,该怎么留白是不清晰的。那就进一步思考,导致留白逻辑不清晰的难点问题是什么?
通过分析,可以看到,如果只需要输出前5行,那么每个数字都是个位数,如果要输出第6行,那么就开始有十位数。因此,是数字宽度的不确定性,产生了这里的困难。
逆向思维,如果数字的宽度确定,那就没有这个困难。所以&m,c:-z/nm +-z/9.!&by. I/ak"M:(c9. xy." 9y$y/&.+ g*:a9ay. 9.*a)."aj:ghi#yaya'z !8++xkm9.*/"nml!amm9... 9.yfy.'+byi)ob,9ny' /.Ic,yb!.(9IN[OH^Z[[m9.*fyi)!L+"y. 9.*..L#ynmacy. 9ak9/% )`ghab!..!XN%`9.9.k&byl`l z(gy.b:/ybymmfy[OH^Z[[fj9bd +9g9... 9.*o%ykd amlc9.&ceyb!8fyy/(:`$./8.(:`$./:a*9y+"yfyiyki.h8[OH^Z[[c`ynm9. 9bdI`#a)z,hy'y+eyb-. 9ie%"`&/9o 9c 9ie'z !8++xkaj:/"n+byi)ony'/.Ic,y/(9yb!.Nfy/&`&/k9/%"z,hy'yc [OH^Z[[.*yc + :+oeyb-fy#"'yiyki.h9d#9ki+j"yfy9.",9g`HYH[ZYKK\]\ N^Q[[ZYKK\]\ N^Q[9 IXNJO |