zoukankan      html  css  js  c++  java
  • 初论刻意训练,CS理论与工程关系

    今天晚上我想就刻意训练,理论和工程之间的联系和差别进行一次剖析式的思辨,当然这只是我目前水平说能看到的理解,以及我觉得是合适我的理解和方案。

    有一本比较出名的书叫《一万小时定律》,后来原理论的提出者觉得这本书的作者表示出的意思并不满意就又出了一本《刻意训练》,前者我知道更多的表达的是对一件事情训练到最后的精通所需要大量的时间,而后者更能一针见血的表示出技能的获得的本质是刻意的训练,很显然我们通常对此并不真正的深以为然。真正能带来思维和行为进步的就是不断的训练,人都是人而已,就算是天才也需要不错的教材或老师的带领才能充分发挥其天分,否者不过很有可能是一个“精明”的店主而已,很可惜,其实在大多数情况下我们并没有什么机会充分的发挥自己的天分,目前社会教育的局限性在一定程度上抹杀掉相当多的可能性,也并一定有机会遇到贵人或看到一本改变人生的好书,平凡的我们在不甘平凡的矛盾中挣扎,有的最后妥协了,有的最后找到了属于自己的路。当我们意识到自己的缺点并希望进行改变的时候,尝试进行对弱势的方面进行可以的训练是唯一最有效的方式。

    经常看到电视上或者小说中某天突然看到一本武林秘籍或者什么法器宝物可以在短时间内逆天改命,最后迎娶白富美,得到权利势,走上人生巅峰。如果这不是电视剧或者小说而是某个人在你面前说了类似的想法不知阁下什么想法,我是表示这人怕是做白日梦想疯了吧。当然你大可以责怪这是什么中国教育的失败或者笼统的说这是人类共通的惰性,而这一切的一切其实并不重要~ 重要的是我们需要怎么做才能走出这个怪圈?自然界有一个比较基础的定律叫楞次定律,事物其实都有保持原来属性的特性,想做出改变的初始是需要比较大的外力的,这好像是火车发动的时候所需要的力更大一样,做出改变,突破自己的舒适区,尝试自己不是很熟悉的领域进行学习,学习其实是一种“反人类”的行为,最关键的是需要毅力,而不是兴趣,当然或许从另一方面说没有兴趣也坚持不下去,而我对羽毛球感兴趣并不能让我成为职业羽毛球运动员。我今天下午在Quora上看到一个比较有一个的话题As an experienced programmer, what would you like the noob(newbie新手的意思) programmers to realize? 有一个高赞的回答是这样说的:


    Passion
    I read about people wanting to ‘fall in love’ with coding, and feel the more passionate you are, the more successful you will be.
    It’s bullshit, the only thing that works is persistence.
    I love playing snooker, I’m totally shit at it though, because I never ‘converted’ that love to hard work and practice.
    Don’t worry about passion, aim for enjoyment, not love, and it won’t replace hard work.


    我不禁有些感叹,真的有人会fall in love with coding?编程更多像是一个手工活,拿木匠类比来说,刨木头这件事的本身是很无聊的,而刨木头这件事的目标和结果是很令人期待的,更多的我觉得应该是对那个美好的结果的向往的愿望所带来的激情让人们坚持了下去,我写程序的目标是为了造福人民创造利润换取更好的生活,而这个目标的实现背后是如何写好每一行程序,如何让程序的robustness更加健壮,面对改变和优化又如何提升可持续性和可扩展性等等所延伸出来的问题都该如何去合理的解决?这是一块又一块的坑需要我们自己动手去填上,所以且不说什么实践是检验真理的唯一标准这么空的话了,做的时候哪里不会填哪里~ 经常在没坑的地方蹦跶,等狼来了就真的会掉坑里的。

     

    今天下午看到YouTube上的一个视频,叫Map of the computer science,用Map的形式将计算机科学的体系的大略展示了出来(写到这里作者折腾了半天终于重新连上iPhone的热点,MD要不是图个拿着舒畅没广告假后台不乱启动软件iPhone的功能真心落后~),计算机科学的理论基础是离散数学,数据结构,算法,数字电子技术,体系结构理论,计算机组成理论,操作系统,网络等组成的一个可用的基础平台,在这个平台之上也就是程序员所发挥拳脚的地方了,Assembly也好,C,C++,Java,Python,JavaScript也罢,上层的语言需要依靠底层的语言所营造成的平台作为运行时环境,用Assembly,C和C++等底层语言编写操作系统和底层工具,Java等上层语言对底层进行集合抽象构造更大的更好的系统,编译时被翻译成字节码文件,运行在JVM上是通过不断的JIT不断的优化热点代码翻译成机械码直接和底层进行通话,当然Computer Science现在对于普通的工程与人员来说可不仅仅指的是代码所组成的系统了,还包括Artificial Intelligence(AI),Robot,甚至于物理学,生物学,真所谓条条大路通CS。

    从一定程度上来说,高级编程语言层次的变化是相当大的,基本上是五年一大变,而计算机基础理论的进展几乎缓慢,或者说发展的方向几乎与我们大众无关,而高层次的语言,甚至是对高级语言实现的功能进行包装抽象的框架中间件也几乎是日新月异,我记得知乎编程优秀话题答主invalids对这个相关的观点描述的还是比较好的,它举了算法的例子:

    算法是一切的基础。
    本科那点算法很浅了。它都搞不定,后面的操作系统原理(玩转分时复用、玩转进程调度、玩转各种缓冲、玩转中断玩转内存分配等等等等,归根结底就是链表、队列、树、LRU等等等等;不仅算法就是操作系统的血液,它还杂糅起来、彼此影响,交织成了操作系统的骨骼血肉)、编译原理、数据库等等,全都没法学。
    类似的,各种流行的库、框架,全都是算法的集合体别人把算 法合理搭配、高效布局,然后希望你在这个基础上, 添加自己的逻辑。
    因为它们已经集成了很多算法,因此当你用它来作点简单的事情时就非常容易,随便几行代码就能解决很多很多问题,看起来极为强大。
    但是,一旦需要你做一点点稍微复杂、稍微进阶的工作,没有算法基础,那就只能抓瞎。


    为什么会抓瞎?
    第一,你理解不了这个库/框架的设计思路。算法不行,再怎么讲你都没法明白,只能做点简单的、拷贝例程类的工作,没有开发稍微复杂的软件的能力。
    第二,哪怕只是做点简单、拷贝例程的工作,你学习起来都非常非常的吃力一太多太多人在我的评论区刷“生命短暂”了。没法子,一个极浅的库,看不懂,必须大量练习才能上岗,自然累死个人一一听说要时刻跟紧前.....真,要命。
    第三,当库本身不敷使用,需要给它一些增强、一些改进时,你绝对无从着手——用都用不好,谈何改进。


    所以我说过很多次,一定要把基础学好。
    基础打好了,那是一次付出100点精力,彻底把自己的脑子升了级;以后随便多新多高级的框架,在你看来都是新瓶装旧酒,都是一两句话都能说清的问题一大体上一眼看穿,细节上咱本就是行家里手,自然不费劲就能跟上时代。换句话说,基础打的牢,日常工作经常是减1点精力加10点经验,越做越轻松,越做越精干。
    反之,基础没打好,遇到个新词,精力-20;遇到个新任务,精力-80.....一路工作你脑袋一路飘-1 -5 -10 -25 -50.....能跟上才叫见鬼了。
    换句话说,基础没打捞,日常工作经常得付出100点精力才能得到一两点成果,然后反倒越干越糊涂了一哎呀这个多线程,我怎么越想越乱了?当年读书好不容易记下来的东西,越干忘的越多...不行不行,当年4年都没学会,现在忙的脚打后脑勺天天996,哪还有精力补.....

     

    你不得不说,这些基础真的很重要,而也确实是作为普通人,很难接触到复杂的算法,也不会真的参与到框架的设计,什么人工智能,机器学习,甚至对于计算机本身的比如组成原理,操作系统,会有什么原理性的接触,公司面试大多是就是那些看似几年后就有可能淘汰的东西,因为公司关心的是你是否能为企业创造利益,至于30岁后你有没有被裁它并不关心。

    再回到理论与工程的讨论,今天早上看到Bruce Eckel在On Java 8中提到2007年给Neumont University的一篇毕业演讲稿,这里有一段是这样说的:

    So here you are, about to be unleashed upon the world. This is a lot like taking someone and teaching them all the parts of English speech and then saying "go out and write stories," but it's probably all any school can do. And a more theoretical background wouldn't help; this is not to say theory is bad because you'll need some eventually but there's a recent movement that preaches "practice before theory" and I, apparently like Neumont, find that knowing how to do something is very helpful when trying to understand the theory behind it -- for me, the theory takes a lot longer to grasp and it's very useful to be able to be functional while my brain is catching up.

     

    当知道一些理论在实践的过程中不断去理解理论背后的意义,理论的本身是异常枯燥,有可能很长时间都不会再涉及到它,而学习一定的理论的本身就是在学习为了更深理论而做的的铺垫,工程理论的本身是对理论和现实的调节,是对现实世界不完美的妥协,完善理论和工程,注定是场长久的旅行,I like it。

  • 相关阅读:
    win10下 Ubuntu 18.04 LTS 的安装及 rlt8821ce网卡驱动的安装
    网络:tcp/ip
    数据结构分类
    面向对象的solid原则
    mysql数据库的操作
    锁机制
    设计模式在项目中的应用
    aop动态代理底层实现模拟
    变量在内存的分配_复习
    java内部类及类加载顺序
  • 原文地址:https://www.cnblogs.com/RQfreefly/p/13511305.html
Copyright © 2011-2022 走看看