铜仁市论坛

首页 » 分类 » 问答 » 软件架构设计入门必备
TUhjnbcbe - 2020/11/28 1:34:00
小儿白癜风如何治疗 http://baidianfeng.39.net/a_zczz/130708/4206077.html

球迷看到的C罗,在球场上大杀四方,肆意庆祝进球,拿奖拿到手软,看不到的是他日复一复每天三千个仰卧起坐的努力训练。本来可以靠脸轻松吃饭的,还要这么刻苦。

每一个行业中出类拔萃的人物,台下十年功都是必不可少的。码农亦不能免俗。

不同于其他行业的是,作为一个剧烈变化的行业,软件架构的定义和必备条件也在不断变化。下面仅从个人经验来看,之前的这些积累对我自身成长有着巨大的帮助,推荐给读者,不代表权威,欢迎大牛斧正哈。

一、科学上网

1)如果不能上Google,要想尽一切办法上去。

2)如果实在上不去,参考(1)

国内近几年不断涌现出来很多牛人,但是相对而言,国内的牛人的社交分享意愿更弱一些。所以Google是必备武器,你能碰到的问题,Google基本都能帮你找到碰到同样问题的人,以及别人对这些问题的见解。

二、理论基础

大学本科的课程中虽然有很多都是摆设,但是其中有几门课程却是必须完全掌握的,包括,离散数学,数字逻辑,计算机组成原理,数据结构,计算机网络,操作系统,数据库原理,软件工程等。

这也是为什么很多招聘方要求本科以上学历的重要因素,如果你没有学过这些课程,或者已经忘了,那么还是要自己找时间再捡起来。

前三门课程(离散数据,数字逻辑,计算机组成原理),虽然很古老,但是有助于你理解计算机内部是怎么工作的,CPU,内存,主存等部件是如何协作让你的程序运行起来。

数据结构:这个不必多说,99%公司面试必定问的问题,这些基本的结构就是软件架构的砖块。作为一名合格码农要搬砖,先仔细看看砖头长什么样,有什么特性,适用于盖哪些房子,怎么盖用的砖头最少盖得最快吧。

计算机网络:现在应该没有人写单机程序了吧,那么最好还是了解一下对应的5层架构以及各种网络协议吧。

操作系统和数据库原理,推荐这两门课程的原因有两个,其一:因为我们写的程序最后都要使用数据库并且运行在操作系统上,了解使用的windows/linux/unix以及各种关系型数据库的内部工作原理,有助于最大程度上优化自己的程序;其二,操作系统和数据库是N多前辈殿堂级大牛的智慧结晶,里面用到的各种算法,简直就是软件设计的十八般武艺。你在设计的过程中可能遇到的问题,在操作系统和数据库中都有可能找到类似的问题和解决方案。

举几个简单的例子:

程序高并发:操作系统的多进程和多线程,生产者消费者等;

任务调度:操作系统的进程调度,死锁控制等;

资源分配:操作系统文件系统管理,数据库的表空间管理等;

最优次优解:数据库查询优化;

快速查找:操作系统缓存,数据库中的索引,n种缓存,临时表空间;

容错:操作系统容错,数据库分阶段提交等;

软件工程:推荐这门课程并不是因为这门课程本身有多么经典,而是软件工程这件事情本身十分重要。软件工程代表着如何从整体上分析把握需求,并使用合适的方法进行分解,并解决的一个过程,同时,还包括如何使用一些工具或技术让这个过程更加顺畅,包括课本上不会提到的代码仓库管理,模块依赖管理,单元测试,持续集成等等。

在移动互联网时代,由于产品经理角色的存在,很多工程师已经免去了需求分析这一步,这其实是很危险的,因为如果你不深入思考产品经理给出的需求文档背后的深层含义,你不知道下一个版本需求就会变成什么样了,到时候你的整个设计也许就要推倒重来,或者需要大量的重构才能复用里面的模块。

这些理论基础要想全面的掌握绝不是大学四年就可以达成的。知识常学常新,每当在实战中碰到问题时,都可以回头找找,兴许就能和古人会心一笑,找到灵感。

在实践过程中,会因为职业的不同处在不同的领域,那么就要自觉寻找该领域的理论基础,以便对领域有更深刻的理解。比如在文本处理领域,那么就要理解统计学原理的马尔科夫随机过程,比如搜索引擎领域,就要去理解词频,TF-IDF等概念。很多理论知识在书本上是没有的,这时候就需要求助于Google了。

三、规范(Specification)

工作的首要任务是解决问题,这本无可厚非,不过也造成了很多人不求甚解的习惯。

比如,要写一个爬虫程序,各种语言都有很多的库可供调用。但是相当一部分人不清楚HTTP,HTTPS协议的规范,包括EntityHeader和EntityBody是什么作用,分别可以放什么内容,各种错误码代表什么含义等等。导致在使用这些库的过程中遇到一些问题束手无策。

又比如,现在很多Java开发者都在用ORM,写程序确实快了不少,但是不少人却对SQL语言的规范知之甚少,连一个完整的SQL语句都写不出来,更别提检查SQL语句的查询计划,子查询和Join的区别和联系,以及怎么把子查询转换为Join了。这种情况下,怎么能指望写出来的程序有多高效呢?

这些Spec在W3C网站(

1
查看完整版本: 软件架构设计入门必备