分类
评论型文章

计算机的内功真的很重要吗?

(在苹果系统下,如果文章中的图片不能正常显示,请升级Safari浏览器到最新版本,或者使用Chrome、Firefox浏览器打开。)

本文原为本人在知乎上的一个同名问题下的回答内容

https://www.zhihu.com/question/392971737/answer/1417910483

计算机的内功就是计算机科学一路发展来的这一套成熟的理论体系和技术框架,简单从计算机专业基础课来说,就包括了:程序设计基础、数据结构、算法、计算机组成原理、计算机体系结构、计算机网络、操作系统原理、编译原理、微机原理、数据库、软件工程和软件体系结构。而数学(包括高等数学、线性代数和概率论与数理统计)则是做计算机科学理论研究的基础

经常有同学不重视这些数学和计算机的基础知识的学习,认为这些内容是枯燥的、过时的、与自己所做工作是无关的,甚至认为是没用的,其实这些基础知识将贯穿今后学习工作甚至是平常生活的始终。而且,我们一直在使用的各种技术,要知其然,还要知其所以然,我曾在知乎和我的博客中对于机器学习中的数学的问题,发过文章说明过这一点,不过受限于当时(2017年)我的认识水平和文字功底,所述也许并不是特别令人满意:

我们今天就再来说一说。

如果你是做着一份每天被老板或产品经理不断地要求修改代码以满足新的用户需求,或者不断地为不同的用户开发定制版软件的工作;或者每天不断地监控着报表,一旦数据出现异常或者平台报警,就立即去处理并消除警报地工作;或者每天不断地从用户那里收集反馈信息,整理然后反馈给相关人员的工作。那这些数学和计算机的基础知识看起来似乎跟你的工作完全不沾边,或者用不上。因为每天都是重复的劳动,每天所做的工作几乎是机械化的,可这样的工作,你确定能一直干得过35岁?35岁以后,更年轻的人会比你更有精力做这些事情。同样每年也会有很多的人,在培训班学几个月就可以上岗接替你的工作。

一个堂堂正正的计算机本科专业的学生难道毕业就是做这些工作的吗?作为一名合格的毕业生,面对不断变化的用户需求,我们要做的是用我们的程序设计思维,以及软件工程和软件体系结构的思维,从变化中发现那些不变的核心,然后进行编程和开发,也就是所说的“万变不离其宗”。

以一个最简单的例子为例,一个博客网站程序,最基本的功能就是写博客,但是有的人需要有分享链接的功能,有的人不要分享链接的功能但是需要有打赏的功能,有的人都不需要这些,而是只需要一个广告位功能并且能够监控用户的目标转化率和收益,有的人还需要给图片加水印的功能,还有别的各种各样千奇百怪的需求等着我们。那我们应该怎么做?作为一个博客网站,写文章是永远不会变的基本功能,那么这一项需求必然是不变的核心功能之一。而各种各样的辅助的功能,比如说分享链接、打赏功能等,我们都可以看作实现博客网站的扩展功能的需求,因为不论其他需求怎么变,唯一不变的需求是需要在博客网站上添加扩展功能。因此我们可以通过一种可插拔的、模块化的动态体系结构来实现。这个可扩展功能就像USB接口一样,当我们电脑存储空间不够时,我们就插入移动硬盘,当我们需要输入文字时就插入键盘,当我们需要录音时就插入话筒耳机和扬声器(虽然目前常见的没有用USB接口),当我们需要拍照时就插入USB摄像头,每个人有不同的需求,那我们就设计一个可以实现扩展这些需求的接口就好了。这时候,我们的代码在结构上是“高内聚、低耦合”的,我们的软件体系结构是由一堆接口统一、封装好的、模块化的组件组成的,它甚至是可以热插拔的动态体系结构。当我们为网站程序设计出这样的体系结构的时候,即使还没有写一行代码,站在软件工程的角度,从理论上讲已经将其他只会按照老板和产品经理随时变化的需求不断改代码的苦逼程序员甩出几条街远了。

如果你对这个插件化的体系结构感兴趣可以看我的这篇以C++为例的文章了解更多细节:

想必,看完我刚才所说,是不是就对软件的开发、编程有了不一样的理解呢?

再说一说计算机网络

这个可跟我们日常太相关了。不论是作为程序员进行相关开发,还是小到我们给家里路由器连个网,无一不跟计算机网络的知识相关。作为一款产品,无线路由器必须要适应普通非专业人员的使用习惯,但作为计算机专业的学生,我们不能仅仅停留在“傻瓜式”操作的水平上。路由器管理界面中有一堆默认配置,不知道有多少人能理解每一项的含义,这些其实都是我们可以对家庭网络进行调优的利器。为什么MTU在有的路由器下默认是1480,而有的是1492或者1500呢?如果发现能上QQ微信,但是浏览器或者其他一些软件无法使用时,我们应该怎么做,考虑过手动配置修改DNS服务器吗?如果发现连QQ微信都发不了,又该怎么做?为什么路由器一般都使用192.168.X.X作为IP地址呢?为什么在别人家无法访问到自己家路由器下的电脑呢?为什么正常情况下我们打不开http://127.0.0.1这个网站呢?为什么我们基本上没有见过224.0.0.0以上的IP地址呢?以及,为什么我们上网的时候,有的网站会打不开,有时候网络很卡,有时候下载速度慢呢?为什么我们更换了千兆网络后,一测速显示还是百兆带宽呢?是否知道当我们打开一个网页的时候,这前后都发生了什么呢?如果我们开发的网站访问很慢,都可能是什么原因导致的呢,应该从哪些方面着手调优呢?学其他专业的同学不懂没关系,作为一个合格的计算机本科毕业生,这些都是我们从事相关工作的基础。

最后再说说机器学习

这个是近几年很火的一个方向,越来越多的人跟风入坑,但是太多的人仅仅停留在神经网络调参上。很多人觉得自己下载一下别人的代码,改改参数,最多再修改一些代码以适应项目要求,然后运行一下,就可以说自己也是“算法工程师”或者做“人工智能”了。首先一点就是,很多人连计算机和数学的基础都不牢固。数学由于本科至少是会教高等数学、线性代数和概率论等课程的,而且包含的必要的知识也不少,很多人都还比较重视,相对来说,在这方面还不算太严重,而更多的人是计算机基础知识的缺乏,而且是相当严重的。

从我了解的某年某组的研究生招生来说,大多数人本科都来自非计算机专业,这本来也没有什么可说的,毕竟很多人想追求自己的兴趣爱好,或者追求所谓的“高薪”,甚至哪怕只是原专业就业不好想换专业,这就需要他们在研究生阶段进行“补课”。但是相当多的人在2年后的计算机基础功依旧欠缺,而有些欠缺甚至是影响正常工作的。曾见一些同学在外部网络环境下输入了半天的192.168.X.X,想连接服务器训练和调试机器学习模型,然后问怎么连不上;曾见一些同学由于只会使用图形界面,在Ubuntu系统图形界面崩溃后,只会(找人)重装系统,于是这台GPU服务器经常处于重装系统和即将重装系统的状态,还有的时候处于断网连不上的状态(因为只会用图形化的远程控制软件,没外网就连不上)。

而且机器学习训练的完成仅仅是万里长征走完的第一步,如果要产品化,在实际中部署,没有计算机的基础功是不行的。深度学习模型由于规模较大,推理往往需要很长时间,我们该如何平衡性能和成本?如何增加QPS数?如何适应实际中的各种各样不同的场景和需求?如何让终端用户(往往硬件性能很差,网络连接质量可能也不好)能够高效的使用深度学习模型?以及深度学习模型是否存在不安全隐患等。这些都是需要考虑的事情,而这些事情,不是一个仅仅会调参的人,能够解决的,所有除了深度学习算法理论本身的事情,都在考验一个人的计算机内功”(开头所说的一些计算机基础知识)

总结一下

这些“内功”都是一个合格的计算机专业人才的核心竞争力,是区别科班和非科班的关键。上述只是一些例子,实际中不仅限于这些。纯粹地写代码不能提升“内功”,专业基础知识(这才是“内功”)的学习储备,不断学习和更新目标工作岗位需要用到的技能,以及在实际中积累工作经验,从长远来说才是提升一个程序员水平的方式。

本文最初发表于知乎,原问题:计算机的内功真的很重要吗?

https://www.zhihu.com/question/392971737/answer/1417910483
版权声明
本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
本文地址: https://blog.ailemon.net/2020/09/10/jsjdngzdhzym/
All articles are under Attribution-NonCommercial-ShareAlike 4.0

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

1 + 3 =

如果您是第一次在本站发布评论,内容将在博主审核后显示,请耐心等待