如果你想or即将成为一名程序员,那你需要知道这些东西!上岗须知~
前两天公司学院的同学给我看了一下即将入职的应届生的数量,真是不少。感慨一下,一批新人即将到来,而自己又老去了一岁。码农是一个必将终身学习的职业。而相关的知识越来越多了。接下来该学什么?接下来该干什么?这个需要你对自己,对这个行业,对供需关系有自己的判断。
码农需要学习的对于这么多的知识,我把它们分成这些类别:
大致上每一类知识对应了一个分工的角色。
这三个模块构成了所谓的基础架构。他们解决的都是机器,以及机器引起的问题。主要的问题就两个:
☆ 可用性问题:
机器都是会出故障的,软件也会有bug。利用软件冗余提高系统的可用性。利用良好的运维自动化系统,用人类来解决重大的系统性故障。
☆ 成本问题:
合理配置资源。运维自动化。理解硬件,最大化硬件利用效率。利用算法和数据结构,构造高效的系统。如何在性能满足的情况下,保证一致性。
这四个模块解决的都是人的问题。现在还需要人来写大量的复杂的代码。因为代码量很大,就需要很多的人来共同协作。复杂的人性,加上复杂的代码逻辑和分工。共同构成了这么一个接近艺术的领域:
☆ 解决分工的问题:
这些复杂度需要被管理起来,使得代码可以被理解。管理的手段一般被称之为架构。从编程语言,到大量的框架和库,到业务的模块划分。大量的代码不是解决机器的问题,也不是在解决业务的问题。这些代码是在解决人的问题。
☆ 解决个体开发效率和质量的问题:
编码指的是类似测试驱动开发等教你如何做好写代码工作的知识。
☆ 解决群体开发效率和质量的问题:
测试指的是黑盒测试,白盒测试这些。
☆ 解决无法按时交付的问题:
项目管理的目标是把各种参与方整合起来,按进度完成目标。
这四个模块一般都是割裂成不同的角色来分工的。但是实际上是互相关联的。比如不好管理的项目,往往是复杂度管理方面出了问题。
所有其他的一切都是围绕业务来做的。最终的目标是用计算机来做一些有价值的事情。计算机程序有两种编码方式:
☆ 用人来写:
需要理解业务,编写业务逻辑。需要组织一帮人来写,需要分工。分工不能瞎来,得基于对业务的理解来。所以部分的复杂度管理是和业务领域高度相关的。
☆ 用机器来写:
同样也是需要理解业务,选取特征。在业务理解的基础上,用合适的数学工具,降低计算复杂度。但是编写程序的过程是由机器来完成的。而且学习出来的模型不需要人来理解和修改,所以不存在复杂度管理的问题。
机器学习得到的程序是一种基于模式匹配的机器,目前这种机器仍然无法直接对规则类代码进行编写。看似和人工编码的规则是相辅相成的关系。
但是某种程度上是在替代人工编码的规则的。规则类代码实现规则只是手段不是目的。从优化的角度来说,规则只是一种优化的手段。法律也只是优化社会稳定性这个指标的一种手段。
然后可以列一个目录,我们可以看到和码农相关的知识类别还是很多的。很多年轻的朋友,一说起要学习。就是要学习golang,要学习网络知识。
掌握底层技术栈的码农虽然仍然稀缺,但是这个问题领域的需求并不如过去那么旺盛了。不要把鸡蛋放到一个篮子里,综合性地建立自己地知识体系会对长远发展更有帮助。
解决机器的问题
如何减少时间和空间复杂度:算法和数据结构
如何用排序提高效率
如何用哈希提高效率
如何用算法保证分布式一致性
如何利用好硬件:理解硬件
CPU/GPU是如何应对内存延迟高随机读带宽小的问题的
● OoO: out of order
● SIMD
● SIMT
● SMT
如何让人类更好地在半自动化系统下工作:自动化
如何让人类更好地影响自动化了的部分:发布变更
如何让人类更好地收到反馈,分析处理灾难:监控告警
解决人的问题
解决分工问题:复杂度管理
按结构分工
按时序分工
按层次分工
● 按同时同地发生的不同特性来分工
● 按计算的依赖层次分工:具体场景的,模板业务逻辑的,流程平台的,基础架构的
解决个体开发的效率和质量问题:编码
如何最大化对个体的反馈
测试驱动开发
日志
可视化
解决群体开发的效率和质量问题:测试
如何让一群人获得整体的反馈
解决按期交付问题:项目管理
解决业务问题
人工编码
让一群人干好活:复杂度管理
在这个业务场景下,如何分工才能最小化沟通
● 如何才能理解业务之间的联系:沟通来自业务内在的耦合
○ 微服务
○ 领域驱动开发
○ 面向对象:单变量派发,多变量派发
● 干好我的活:业务逻辑
○ 熟练的使用框架和库:踩在巨人的肩膀上,快速落地。要能快速学习新的语言和框架
○ 证明业务收益:效果评估,置信度
● 找到业务价值:数据分析
○ 理解业务如何运作:业务流程的理解和建模
○ 软件可用性:如何让用户喜欢,高效。基本的交互设计能力
○ 视觉设计:至少得会画界面原型
○ 产品设计:竞品分析,市场研究
机器学习
提高业务得到的收益
降低计算成本
复杂度管理部分,展开一下
相同空间,相同时间:在一个点上多股“不相关”的逻辑汇聚到了一起
1、功能性需求和非功能性需求的同时处理,比如计费和内存分配,同时管理。很多类型申明的活是为了硬件优化,比如const和immutable。处理特定编解码的逻辑,和
2、正常流程和多种异常流程的同时处理,高可用需要额外加很多代码。但是和主线业务的理解是无关的。
3、同时操作多个CPU核:用一条指令操作说明多个并行的计算流程,比如SIMD本质上是把并行的计算用一个指令流来操作
4、多线程共享的代码:要考虑同一段代码被多个线程并行执行的各种交错的时序
5、不同侧面的业务需求同时处理:发单和促销和运力撮合
备注1:相关和不相关和阅读者有关。特别是非正交的业务需求。
备注2:分开了之后也未必就不复杂了。有些时候存粹就是解决方法太笨拙。有些事情是问题本身就是一个逻辑上很复杂的求解过程。
相同空间,不同时间:
1、不幂等的代码。有副作用的代码。全局变量多的代码。两次执行会有不同的结果,需要考虑之前的状态。
不同空间,相同时间:
1、在多份代码上保持概念上的完整性。极端例子是拷贝的代码。让多个模块都认一个概念(比如n元组),也算是维护概念完整性。
2、在多个存储上保持数据上的一致性
3、完整的一段逻辑被拆成特别细碎的小函数,造成每个函数都没法说明自己到底干了啥。这里函数也可以换成微服务。
不同空间,不同时间:
1、同一个流程的多个步骤逻辑被打撒到了步骤的代码里,和该步骤的其他业务混到了一起。没有一个视觉上可见的实体来代表一块前后有密切联系的“功能特性”。
2、跨越多个代码库,多个时间点的职责上的循环依赖
简单来说可以归纳成两种:
1、需要关注到一个物体的时候,没法聚焦。分散到很多地方了,或者被其他逻辑淹没了。
2、同时跟踪多个物体
涉及:游戏开发、课程设计、常用软件开发、黑客等等...
如果你想or即将成为一名程序员,那你需要知道这些东西!上岗须知~的更多相关文章
- 作为一名程序员,在面试中如何展现你Python的coding能力?
来源商业新知,原文标题:如何在一场面试中展现你对Python的coding能力? 如果你已经通过了招聘人员的电话面试,那么下面正是该展现你代码能力的时候了.无论是练习,作业,还是现场白板面试,这都是你 ...
- 【G彩娱乐网】作为一名程序员,我应该如何选购一台电脑?
G彩娱乐网说到程序员专用电脑,那肯定是苹果电脑.优点有很多,比如白平衡特别准.酷炫的黑科技.特别方便的软件等显而易见的优势:也有能够增加提案通过率.专注工作提高工作效率这样的玄学buff. 但是!并不 ...
- Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
作为一名程序员这些代码托管工具你都知道吗? 作为一名优秀的开发者,大家都会用到代码托管,我本人用的是github,确实github里面有很多很多开源的项目,所以我们目前的创业项目程序员客栈www.pr ...
- 3名程序员被抓!开发“万能钥匙”APP,撬走3个亿
来自:程序员头条 报道 又有 3 名程序员被抓!开发"万能钥匙"APP,撬走 3 亿! 前几天,据央视新闻报道,上海公安机关接到共享单车企业报案,随后破获了一起共享单车万能解锁 A ...
- 科普,想成为厉害的 Java 后端程序员,你需要懂这 13 个知识点
老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 站 ...
- 怎样从一名程序员过度到项目经理(整理自csdn论坛) 选择自 whoopee 的 Blog
1.从程序员到PM,是一条脱变的路,事实上程序员走的路最终不应该是项目经理.首先有一点需要明白的就是,一定规模的项目中,项目经理不需要太懂技术,他可以是一知半解.项目经理的任务不是在技术方面,技术相关 ...
- 科普,想成为厉害的 Java 后端程序员,你需要懂这些
站在运筹帷幄的角度来看,一名厉害的 Java 后端程序员都需要懂得哪些知识呢?我想,这也是很多读者迫切想知道的一个问题,因为如果不站在一个宏观的角度的话,所有学过的知识点都是零散的,就感觉像一只迷路的 ...
- 想要薪资20-30K,Python程序员认真敲代码就够了!
在这个年代,互联网的飞速壮大大家有目共睹,除了表露出的公共受益,其中计算机编程者也是做出了巨大的贡献,即使外国编程语言仍旧属于领导者,但是在互联网的壮大下,我们这是"地球村",国内 ...
- 推荐一本好书给即将走入工作的程序员and程序媴
近期买了几本IT届推崇的经典书籍.当中有一本<程序猿修炼之道:专业程序猿必知的33个技巧>.由于这本比較薄,所以先翻着看. 这本书有别于其它的技术书籍,事实上算不上一本技术书籍.它不是教你 ...
随机推荐
- 4.FFMPEG-AVFrame
在ffmpeg中,解码前的数据结构体为AVPacket(参考:3.AVPacket使用),而解码后的数据为AVFrame(视频的YUV, RGB, 音频的PCM,数据量更大) 1.AVFrame介绍 ...
- 360浏览器最小字号12的坑 -彻底搞清rem
之前做响应式网站,使用rem作为单位.因为浏览器的默认字号是16px,设置html {font-size: 62.5%; /*10 ÷ 16 × 100% = 62.5%*/},刚好1rem =10p ...
- 学习go的一些笔记
反射 reflect type CfgSt struct{ Match *int64 `ini:"match"` Desc string `ini:"desc" ...
- Scala的lazy应用
如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会起作用. 例如:对于特别耗时的的计算操作特别有用,如打开文件IO,网络IO等. import scala.io.Sourc ...
- spring cloud微服务快速教程之(十二) 分布式ID解决方案(mybatis-plus篇)
0-前言 分布式系统中,分布式ID是个必须解决的问题点: 雪花算法是个好方式,不过不能直接使用,因为如果直接使用的话,需要配置每个实例workerId和datacenterId,在微服务中,实例一般动 ...
- 使用swagger遇到的问题
1.定义全局的请求参数时, defaultValue不能是中文,不然一直是请求中 ParameterBuilder userName = new ParameterBuilder(); Paramet ...
- Java中的lambda匿名函数使用
Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...
- 快速上手开发——JFinal配置(全步骤图文解析)
摘要: 因为发现官网上只有Eclipse的配置文档,就写了这篇基于IDEA+maven的配置流程.本文使用安装了maven插件的IDEA进行配置,为了照顾IDEA新手,几乎每个步骤都截了图. 环境说明 ...
- xss利用——BeEF#stage4(其余功能介绍)
目录 信息收集 => 社会工程 =>网络扫描 => 结合metasploit => tunneling => xss => 维持权限 功能介绍 #1 - 信息收集 ...
- Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...