其实,软件开发人员的工作职责远远超过单纯的计算机编程。
在参与软件开发的整个生命周期中需要开发人员担当多个角色,努力通过研究和替代技术等解决问题的方法来实现产品研发目标,从而改进整个产品。
要想成为软件开发的专家,需要我们完整了解软件开发的流程,并在关键部分掌握丰富经验。
需要我们了解设计模式和算法的细微差别,同时遵循软件开发的最佳实践,包括创造性和思考力,为编程问题提供合适的解决方案。
实现这一目标需要掌握服务器端开发、客户端开发、DevOps运维、云计算、网页设计、分布式系统、数据库、编程规约、代码管理、基础设施管理、可扩展性、安全性待方面的能力。
你可能未必全部掌握以上内容。但是可以尝试从表层了解绝大部分内容,然后再深入掌握其中几个技术。
以下给各位列出开发者缺乏的几个主要技术能力,而技术管理者或架构师在招聘这些职位时应该熟悉检查这些要素。
编码规范
编码规范有助于确保良好的开发实践和产品开发。要了解一些最重要的编码规约:
DRY(不要重复自己),SOLID , TDD , 防御性编程
设计模式
设计模式在软件开发中是一种常见的,可重复使用的解决方案,可解决软件中的常见问题。软件开发者要了解一些常见的Design Partern是非常重要的,还有更重要的是要能够识别给定问题的正确设计模式。如MVC、Singleton、DAO、Facade、Proxy、Adapter、Strategy和Absract Factory等一些一流开发者使用的设计模式。
服务器端开发
在较复杂的软件系统中,后端会有各种各样的逻辑。作为后端开发人员,处理应该程序的业务逻辑就要面临很多挑战。任何开发人员都能够编写代码,但是只有有经验的开发人员才可以写出具有高性能、可伸缩性和可靠性都好的高质量代码。开发优秀软件的过程涉及的领域包括大量科学、数学、计算机等专业知识,有处理的思维和经验非常重要。
高速缓存
数据缓存的各种机制(文件、数据库、内存、反向代理、HTTP....)
内存管理
Java有一个非常好的垃圾收集器,能够自动管理内存,清理未使用的对象并释放一些内存。但是一个资深的Java开发者需要对内存的工作原因有一个非常透的理解,这样才能写出高性能和优化的应用程序。
了解以下概念至关重要:
堆栈,堆,强引用,弱引用,转义引用,如何引用字符串,垃圾收集过程,meta空间,垃圾收集器类型。
异常处理
这是一个相当重要,也是一个比较大的话题,我们后续会再写关于它的专门文章。现在,列出一些处理异常的一些良好实践:
1、遵循“错误优先”原则使软件更可靠
2、不要捕捉无法恢复的异常
3、不要记录完异常后,又将异常抛出来
4、选择正确的层来处理异常(例如:DAO不知道是数据库的故障如何处理,但是服务层可以知道)
5、如果无法从异常中恢复,则优先选择未经检查的异常
IO操作
了解I/O操作的成本以及可能出现的不可预知的结果。
异步编程
使用线程实现Java中的异步编程,它也是Java平台的基础部分,有效使用并发对于构建高性能应用程序非常重要。
比如线程池、死锁、生产者-消费者、原子性、不可变对象、信号量等等词汇对资深开发人员来说不应该是新东西。
批处理
在实际场景中,编写批量作业非常普遍。通常执行重要的任务,有一些基本规则:
1、每个任务应该按输入、处理过程与输出进行划分;
2、始终轮询批量输入数据;
3、处理器应该是线程安全;
4、产出物应该为原子属性;
5、存储工作结果;
6、要考虑EIP模式。
分布式计算
在现代世界中,分布式计算是指使用分布式系统来解决计算问题。然而,分布式系统与传统系统不同,具有非常高的复杂性。当用户开始高速增长资源消耗较大时,有分布式系统工作经验的工程师会在此时发挥作用。微服务软件体系结构是分布式计算以及分布式体系结构所有的优点与折衷的一个很好的例子。
而今,微服务是当今软件工程师之必备技能,就需要我们对分布式系统有丰富的经验。
比如容错性,可用性与一致性,分布式事务/事件、同步与异步通信,分布式认证,分布式应用,共识应用程序等非常重要。
数据库
精确掌握与数据库从通信到获取数据中要涉及的所有成本,如连接握手、数据传输等情况。清楚了解原子事务以及如何确保数据一致性。因此,数据库管理是软件开发人员的必备技能。
数据库用于管理数据,这是一项艰巨的任务,即使不考虑将业务逻辑添加到数据库中。 在大型IT系统中,数据库在安全性,可伸缩性,容量和可用性方面面临着诸多挑战。我们要考虑加密,复制,分片,大数据等问题。 了解数据库的工作方式以及如何优化它以及每项处理消耗的成本(例如,占用内存、CPU数)将有助于有效设计系统的数据库管理。
DevOps
主力开发工程师要有能推动DevOps的文化理念和实践的能力,在所有运维步骤中做到自动化,提高高质量和高速度交付应用程序与服务能力。代码部署或配置基础设施必须为自动化,且要灵活以及受到监控。
一个强大的开发者应该很好地了解从测试,发布到部署和基础架构管理的全开发生命周期。需要我们了解云计算,Linux,网络,容器,工程管理等。
代码管理
鉴于代码的重要性,只有主力开发人员才能够掌握代码生命周期,并力促软件工程最佳实践。 为此,需要你熟谙源代码管理系统,比如Git,对分支策略,版本控制,分布式修订控制,另外还有代码质量保证工具,代码间的通信和依赖管理,配置管理等有清晰的思维。
安全
Web安全是件很难处理的事情,一部分取决于许多外部参数; 软件工程师需要遵循构建安全Web应用程序的最佳实践与准则。
主力工程师需要对信息安全有较深的理解,不仅要如何避免构建不安全与容易受攻击的系统,还需要知道保护用户的隐私。
一个伟大的开发人员需要能够创建一个指南来处理前10个Web应用程序安全风险。 在Web应用程序中,我们有更多需要工程师关注安全威胁,其中包括如下:
1、上传文件检查;
2、密码暴力破解;
3、会话到期处理;
4、会话来源验证;
5、通过网络安全通信;
6、安全的Cookie访问;
7、用户凭证处理。
前端开发
前端开发是软件开发重要的一部分,如果您不知道程序设计与良好用户体验的关系,则不能成为主力软件工程师。
在前端世界中,JavasScript和CSS是软件工程师必备的。 在这两方面掌握掌握并不容易,但了解它们的工作方式以及两者如何与HTML连接一起,使我们能够提供出色的用户体验非常重要。
若要领导一个前端团队,你需要知道的不仅仅是如何建立一个漂亮布局,要想前端开发做得更好,你需要了解如下:
1、浏览器作为引擎可以构建什么?
2、如何开发响应式网站;
3、如何提高网站的性能;
4、如何开发单页面应用程序;
5、如何建设现代高效的发展环境;
6、熟悉HTML5 API。
7、熟悉React.js或Vue.js框架
Web开发是一个巨大的技术领域,为了掌握这些技能,开发人员需能够自我激励,主动学习新技术,并在职业生涯中给自己扣上很多帽子。 继而不断挑战自我,然后更好地解决问题,这就是编程的本质。 知识很重要,在某些复杂问题的情况下更是如此。在变化如此之快的IT技术领域中,知识的获取在任何时候比我们已会的技能更为重要。
作者:tom.smith
编译:21世纪技术官社区