转CS转眼已快到一年,说说收获吧
#include<iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello World" << std::endl;
}
1.抽象
将生活中最为具象的细节抽象成为能让计算机来做的事情,这可能就是我理解的编程的任务。然而将近乎可以无限细分的真实世界计算出来,保持一个准确的状态,预知下一次动作,这可能就和图灵的“无限纸带”一样难以实现。值得庆幸的是作为一个正常人的感知能力是有限的,所以在我们眼中的真实只是在我们观测范围内的真实,要做到这样的模拟并不需要那么长的“纸带”,也许在许多年后硬件算法高度发达的时候,真的可以“以假乱真”吧,想想还有点小兴奋呢。
个人认为“类比”是理解抽象的极为有效的方法,理解“封装”的时候类比了“黑盒”,理解“递归”的时候类比了“分形”,刷题的时候则类比了无数的图形(其实最后基本都是树状结构)。而我理解的“面向对象编程”就是用类比的方法总结出来的高度抽象的模型,以此模型可以在遵循一定规则的情况下模拟生活中大量的事物。但是将object以及它们之间的交互抽象成线程、进程。。。逻辑元乃至简单的开关、有无,这个过程又是充满了各种挑战。好在计算机科学不同于数学物理,它是先有了高度抽象的东西(电路),然后才有的自上而下的探索,毕竟自上而下的变革总是会有更少的牺牲,这么看来计算机发展的这么快也不足为奇。
从这个角度理解的话,我们真的在计算机面前扮演了造物主的角色了。
2.代码
我第一次听到“工业级代码”这个说法的时候吓了一跳:原来代码的世界已经如此接近现实。
现在回头看当初,阻碍我学习的最大矛盾恐怕是我太过于把代码当成硬件,里面的术语诸如接口、协议、多态、成员甚至是数据结构、算法,这些东西真的就是字面意而已(笑),然而硬件还是那个硬件,代码可不是原来那个代码了。除了比较底层的代码(操作系统之类),生产生活中的绝大部份代码已经具备了惊人的可读性,稍加训练的人便可以像读英文一样读代码(不在意具体实现的话)。“设计模式+面向对象的语言”,就像“社会规则+具有专业技能的人”,代码如同人类一样生活在计算机里,知道自己的职能,知道自己的权限,被各种规则约束……当然,代码并不是一味地追求可读,疯狂追求性能的c/c++,为了安全各种符号满天飞的objective-c和swift,强行模拟多线程的javascript(日了狗的CS-570)。如何把握安全、高效、可扩展、可读之类属性之间的平衡,我想这才是一个写代码的人真正在关心的事情。
3.态度
代码的世界里没有膜法(+1s)
事实上只要有好奇心,就可以理解关于计算机的一切,甚至可以亲手实现它,这是很美妙的。
从电流开始被一步步隔离、封装,直到最后展现在屏幕上面,每一步都是有理可循的,没有任何一个角落是不可理解的,如果说把视界限定在电流、电压以上,那么计算机的世界几乎是个可知的世界,一切都可以被理解、实现,人们只需要把精力放在探索、创造上,这把上帝瘾,不过不行啊
毕竟这个世界上恐怕没有比计算机更讲道理的东西了
(完)