当前位置: 首页 > 科技观察

注意以下三点,让你从程序员变成工程师

时间:2023-03-22 12:34:33 科技观察

刚开始工作的时候,面试官曾经告诉我:努力工作两年,你可以很快从程序员成长为工程师。当时,我感到很惊讶。从很多招聘广告来看,“程序员”不等于“工程师”,“工程师”听起来更好听。工作久了,才明白“程序员”和“工程师”真的不一样——程序员只写程序,而工程师写的程序能在现实世界中创造价值。遗憾的是,很多软件开发人员可能并没有意识到两者的区别,甚至时间久了,他们也只是程序员,并不是严格意义上的工程师。所以我就根据自己的观察和经验来谈谈程序员和工程师的区别。***,工程师不写黑盒程序“程序=数据结构+算法”,这个著名的公式大家都知道,不幸的是,它不适合在工程领域或现实世界中描述程序。程序很多,数据结构和算法写的很好,功能足够强大,系统也足够复杂,但是——很难调试,一运行就停不下来,没人知道是什么程序现在正在做什么,里面发生了什么。别觉得好笑,我遇到过很多开发人员,工作三四年甚至五六年,还不停地出黑盒程序:解决问题最好的办法就是杀掉进程,重新启动(天啊,你的程序关闭不安全)。当然还有更牛逼的,直接用开发机连接生产数据库(在防火墙上开个洞)调试。你说他们技术不好?显然,各种技术问题也可以得到解决。你说他们没有系统意识?办的手续可不简单。但是,他们所做的充其量只能称为“程序”,而不能称为工程上成熟的“系统”。什么样的程序不是黑盒子?你需要考虑它的层级划分,你需要考虑哪些(功能外)操作信息必须被暴露和记录,以什么方式暴露记录,你甚至需要考虑这些暴露和记录对性能的影响,以及程序需要对外提供什么操作接口……当你考虑清楚这些,写出一个让操作细节“尽在掌握”的程序时,你的一条腿就跨入了“工程”之门.对此,各大互联网和软件开发公司都会更加关注,但并不代表个人没有追求的空间。大家都知道怎么写网络爬虫,也都知道要想准确抓取数据,调试起来会很麻烦。我的一个朋友在大厂写了一套“可视化”的爬虫,通过一步步操纵语句的执行,可以快速定位问题。这个级别的工程师属于可遇而不可求的类型,大家每次谈起来还是夸赞的。二、工程师注意实现和接口的分离Java面试中的一个经典问题是:请描述抽象类和接口的区别。通常,大家都会知道“接口”和“实现”应该分开。遗憾的是,很多人理解的“接口”只是狭义上特定语言提供的Interface,而没有考虑“接口”的真正含义。接口的真正含义是什么?计算机最擅长处理的是信息,它可以让信息高速流动,没有现实的阻隔。如果说“实现”是干脏活,那么“接口”就是下达指令干脏活的窗口。脏活累活做一次就够了,但是发布指令的窗口可以有几千个。具体来说,就是程序员完成了功能,工程师完成了功能,想象着怎么用,让它好用。我见过很多这样的程序:一开始把loginsession放在本地内存是没有问题的,但是当切换到数据库方便session传递的时候,就要做很多工作了,虽然需要做的仍然只是访问;程序自动加载的数据如果有问题,根本无法手动加载;如果把以往手动加载的数据改成自动加载,推倒重来……是否有接口意识,是否能真正区分接口和实现,这是程序员和工程师的很大区别。标识。第三,工程师注重功能的逻辑联系。许多系统都处于不断变化和改进的过程中。程序员看到的是功能点,工程师看到的是功能点之上的逻辑。任何系统当然都是由几个功能组成的。但在功能点之上,还需要一个具有逻辑意义的大网络,将功能点组合起来,降低复杂度,成为大家看得懂的对象。最简单的“登录”包括数据录入、数据校验、登录信息记录等功能,“登录”是这些功能的逻辑集合,是理解这些功能的基础。随着时间的推移和业务的增长,可能会有越来越多的新功能,比如加载用户数据、通知好友、准备推送广告等等。当然,这些功能很容易实现(因为它们很具体),但是功能堆积的后果就是复杂度急剧上升,因为功能之间的逻辑联系被切断了。因此,工程师们必须思考如何将这些功能组合起来,放入逻辑动作——比如“登录”?正是通过这样不断的思考,才能将系统的复杂度控制在较低的水平,便于大家理解。这个例子看起来很简单,但做起来可没那么容易。有时看到复杂的系统操作手册,让人哭笑不得:1)点这里;2)点击那里;3)enterthis...这些操作的逻辑意义如此准确,应该一次性自动完成,将它们分开的后果大大增加了系统的复杂性,既不方便维护,也不便于操作。来擦屁股的只能是开发者自己。我经常反思自己所受的教育。在学校写程序和在工作中写程序很相似,但又似乎完全不同。只有亲身体验和思考才能体会其中的不同,所以我想把自己的所见所感写下来。悟性好的同学,有机会接受好的培训,大概不需要懂这个。但是对于那些不具备这样条件的同学,希望我的唠叨能给大家一点帮助。