关于跨专业的一点思考: 从土木到计算机

新的开始

1 关于土木跨专业

开始接触计算机的时候, 学习了数据结构和操作系统, 加上有之前土木工程中积累的数学基础和工程实践基础, 本应很好跨入这个行业, 但细细想来, 最大的失误还是由于思想上的失误.

和土木工程类似, 软件工程也是一门工程实践性活动, 不在于追求正确, 而是在之前科学发展的基础上, 利用已有工具和已有方法(或者说是工程思想), 来构造出"可靠"的产品.

这样的理解, 所有的工程人员应该都会赞同.

2 个人情况

年初, 抱着这样的心态, 开始了转行, 俗话说转行穷三年, 当然三年并不算什么, 只要坚持下来肯定有收获, 这也是我为什么会有今年收获的原因.

年初参加培训班, 就完全把这个思想和工具使用的过程跑偏了.

当然这个只能算是误入歧途, 就好比病急乱投医一样.

到了现在10月, 之前去过一家公司, 看到的是转行和真正计算机出身的差距.

因为本应接触到的是思想, 但实际一直被培训班灌输的是怎么按部就班地使用工具, 就好像是一只猴子在学习怎么用筷子一样. 还好只是在那里呆了2个月就退学了. 不过还是那句话, 并不建议跨专业者直接去培训班, 完完全全的扯淡! 对于计算机专业的学生, 可以进去看看, 不说学什么, 只是进去感受一下整个社会的环境.

3 有所感悟

软件开发本就不是一门手艺, 而是一个系统性的工程.

听过MIT或者Stanford公开课的同学就会知道, 开始先从一门语言入手, 学习的并不是语言, 而是思想及原理, 等到学生学会了某些思想或基本原理之后, 便继续学习之后的课程.

而之后的课程就是在思想的基础上介绍各种语言工具. 再在已有的工具基础上继续学习思想, 这样往复, 再者开始学习软件工程中的一些科学方法, 造就出的就是专门适应于软件工程方面的人才.

4 对于跨专业又没有多少基础的人的建议

  • 就和跨考计算机研究生一样, 首先是要有基础, 计算机理论基础无外乎就是考研强调的那四科: 数据结构, 操作系统, 计算机网络, 组成原理.

  • 要学的是原理以及思想, 要利用的是工具. 比如那些把自己框在JAVA, 框在 iOS 上, 对于各种框架里面有什么东西滚瓜烂熟, 但写出来的软件到最后发布还是漏洞百出, 这样的人并不是真的码农.

  • 软件工程: 仍然是学习它里面的方法. 传统的软件方法学, 面向对象软件方法学.

    但是不要跑偏了, 不要想着学了方法学就成了巨牛的软件工程师, 方法学只是教导方法, 能够将方法应用到实践中去, 才是真~牛逼!

    并且跨专业的人缺的是: 相关的专业训练.

    我很推崇在做中学, 但是要让跨专业者, 在一年内做到计算机专业学生4年或者是7年甚至10年内所接触的所有训练, 这个简直是痴人说梦.

    我自己的办法是, 尽量在巩固基础的前提下, 分阶段完成一些训练项目.

    之前公司内完成的项目也让我意识到真正工程化的实践活动需要的是什么, 现在也在不断努力, 不断推进...整个软件大环境普遍急功好利, 开始做一个软件, 想着的是快点做完, 做完拉倒, 新功能来了, 囫囵吞枣一顿加, 加完发现bug一大堆, 前面的bug还没改完, 后面的bug接踵而至, 从来没有单元测试, 回归测试, 直接转到有中国特色的"用户大规模测试", 这么讽刺的事估计也只有小公司才会遇到, 我在工程单位的时候, 再怎么垃圾的单位他也还是知道修桥的时候要不断地测量, 要做材料试验, 做完了也要做加载试验啊.

    很多书上把面向对象思想形式化地描述为: 继承, 封装, 多态. 或多或少地在误导消费者, 把面向对象思想简单描述为这三点是不是有点牵强呢?

    那有的人就会想, 那我在某些面向对象的语言中能够实现这些, 我就掌握了面向对象思想咯!

    简直就是扯淡.

    以前的时候, 数据和对数据的操作是分离的, 在软件开发的时候, 待到软件规模大到一定程度, 人脑不一定能够驾驭得了这么大规模的软件结构.

    面向对象软件开发中, 将数据与其相应操作封装到一个可以被识别的对象内, 和人类的思维习惯类似, 再者, 可以把若干个对象组织起来, 构成模块, 再者, 将多个模块组织起来形成更大的模块, 这样才能构造出现代的大型软件系统. 不管你是分层还是分模块, 基本思想不还是: 你给我一些输入, 我就可以保证在这个结构内给你想要的输出.

    再想想, 面向对象解决的问题, 不就是几点:

    • 软件复杂性问题:

      就好比制造一个汽车橡胶轮胎, 你可以先买来橡胶, 钢材(也就是数据), 然后你学会怎么把橡胶弄成一圈, 然后学会怎么将钢材弄成适合形状(操作), 然后通过这些操作加工这些数据, 最后生产出一个轮胎.

      上面这一轮的思考是: 你总是作为所有过程的直接参与者.

      面向对象时的思考方式呢?

      还是生产轮胎: 我就可以请一个做橡胶轮圈的人, 一个做轮毂的人, 请他们生产好轮圈和轮毂, 再请一个组装人员, 搞定组装, 一个轮胎现身.

      就生成这个层面上, 两者的差别还是挺大的, 有人可能会问, 最后细分下来, 不还是和最开始的思考方式一样么?

      能一样么? 确定的对象总是具有确定的功能, 这样就可以将模块按照人类的思考方式划分, 最后的产品出来是一样, 但生产过程的管理不是更加轻松?

    • 工程方法的改进:

不建议非计算机专业的一开始就跨入"计算机科学"的范畴, 因为如果你真的想研究计算机科学的话, 那么你肯定并且绝对是: 数学专业的, 物理学专业的, 计算机相关专业的...

posted @ 2016-10-19 17:12  貘鸣  阅读(7102)  评论(2编辑  收藏  举报