In a company which provides software products or Internet services, we set different IT positions according to various jobs in the technical department, try to build an efficient and effective team and ultimately output the most valuable things.
本人在 IT 行业工作数年，发现不少公司，不少人甚至高管对技术岗位的认识有偏差或错误，故写作本文，尝试更准确地描述不同的技术岗位，或许可以帮到一些人。
I have been working in IT companies for a few years, unfortunately, I found many people, including company executives, misunderstand the duties of IT posts. This essay tries to describe various technical positions more accurately and hopefully, it could help someone.
The article "Am I still a Junior Developer?" analyzed and described technical abilities that a junior and middle-level developer should comprehend and master, excerpts are below.
- 理解基本编程概念 Understands basic programming concepts
- 开发代码时不太考虑性能和可维护性 Will produce code without keeping performance or maintainability in mind sometimes
- 会使用类库和框架，但并不总是理解相关工具实际做了什么以及它们是怎么做的 Can use libraries & frameworks but will not always understand what the tools are actually doing for them and/or how’s it doing them.
- 即便不理解，也会从网上（比如 stackoverflow.com）拷贝代码来使用，只要这些代码能工作 Might copy & paste code from the web (such as Stack Overflow) without understanding it, if it just works
- 偶尔会需要导师予以帮助 Will need occasional mentorship
- 工作受阻时，有时会担心别人认为自己不够好而不愿向他人寻求帮助（你是很不错的，寻求帮助很正常） Sometimes won’t ask for help when stuck because of fear thinking you’re not good enough (You are good! It’s ok to ask for help 😊)
- 深入地理解一门或更多编程语言 Understands one or more languages more deeply
- 编码时总会考虑性能和可维护性 Will produce code with thinking about performance & maintainability
- 使用工具时，理解它们做了什么，经常会考察工具源码来理解其工作方式，也会寻找缺少文档的工具的其他用法 Understands what the tools are doing for them, digs into the source code often to understand how it works & also finds undocumented usage of tools.
- 在考虑从网上拷贝代码之前，会先去理解它们 Will understand code found on the Web before even thinking about copying & pasting the code.
- 当工作受阻时总会去寻求他人的帮助 Will ask for help when they know they’re stuck (because asking for help is ok!)
说起高级程序员，有时我也会像 Florian Rohrer 的一篇文字那样发出类似的疑问：《你什么时候可以说已经懂得一门语言？》 对于高级程序员而言，相比于初中级，“高”在哪里？他是否一定要在各方面胜出？答案很明显是否定的，那么应当以怎样的标准进行衡量呢？
Speaking of a senior programmer, sometimes I would raise questions like Florian Rohrer asked in "When Can You Say You Know a Language?" Relative to junior & mid-level programmers, where can we find how "high" they are? Do they have to be head and shoulders above others in every aspect? Obviously, the answer is negative, but how could we measure it by what standards?
- 从技术的角度对初中高划分，其思路应当是横向+纵向的。比如对编程语言的语法，API 的认识，不仅要考察程序员对其准确性、相关性、优雅度这样的横向认知，也要考察其对语言、API 的发展历史的纵向认知。之所以作纵向考察，是因为这样能衡量出其对技术的关注度，是否会对发展逻辑作深入思考，从而对技术的走向有一定的前瞻性。纵向知识同时也表现出一个人知识范围的广度，不仅仅是本学科领域的知识，也包括其他领域。 From the perspective of technology, we need to consider it horizontal & vertical when facing the three levels. For example, for grammar/syntax of programming language, understanding of APIs, not only do we inspect a programmer how he looks at both of the aspects of accuracy, relevance, gracefulness horizontally, but vertically inspect depths and the history of them. The reason why we inspect the vertical side is, we could measure how much he concentrates on them, whether he would think of the logic of development deeply, subsequently, make trends of technology with extraordinary foresight. In many cases "vertical knowledge" demonstrates how wide a technical personnel's knowledge he has, including various knowledge in other realms.
- 从非技术的角度看，一个有着广泛知识的程序员（比如艺术音乐体育等），往往能借鉴其他领域学科的模式、解决方法来审视当前遇到的问题，从一个新的视角“更有创意地”解决问题。 From the perspective of non-technology, a programmer who masters wide knowledge, (art, music, sport, etc,.), he would probably learn patterns and solutions from other fields so that he could offer a solution more creatively with a new sight when dealing with problems.
Three virtues/characters a star programmer should have when interviewing with 滨野纯:
1，最重要的第一点是，能够持之以恒地做某件事；First and foremost, be persistent when you start something.
2，拥有良好的直觉和品位。良好的直觉，这里是指面对一个新问题时，即使没有完整的解决问题也能够凭直觉提出正确的解决思路和方向。Processing good instincts and tastes. Good intuition means that when we are facing a new problem, we could raise correct solution ideas and directions even could not solve the problem utterly.
3，沟通能力。这个沟通能力不是说只要说明 “我想做什么” 就可以了，而是能够解释 “我的目标是什么” 以及我得出这一目标的整个思维过程，并且更重要的，是能够让其他人信服，简而言之就是能够将自己的目标明确传达给他人的人。Communication ability. This does not mean that it is sufficient if we tell others "what I want to do", but illustrate clearly "what is my goal" and the whole process how I formed the goal, and more importantly, make others convinced. In short words, it is an ability that we could articulate our purposes to other people.
A remarkable ability a technical manager should have is how he/she troubleshoots an application. Based on the information from front-end page, the pattern a problem occurs(timing, frequency, position, etc.) Another ability could be he/she knows where to apply a technique in the most appropriate way, this would bring many benefits to project management. As a manager, he/she inevitably has to be well acquainted with each subordinate, subsequently could arrange tasks more precisely, set test or review operations, prevent from outputting unqualified codes.
In mainland China, the technical manager and project manager are de facto the same person in many software companies or departments. Of course, the cost could be a major concern, but under many circumstances, it is due to a misunderstanding of software development. Admittedly, a talented personnel can have multiple job duties, but as for a considerably complex system, such as continuous requirements change, high staff turnover, different levels of developers' ability or complicated business logic, it would be better to separate into two distinct roles. As such, a project manager can focus on tracing and pushing a project, connecting with other departments, etc.
Who is eligible for an architect? Which skills should he/she grasp? The article "The role, skills, and duties of a software architect" elaborated on this subject.
In my opinion, not only can architecture apply to technology, but to an individual employee, business logic, etc. For an employee, the comprehension of his techniques, his relative experience, enthusiasm for new technology, breadth and depth of knowledge, and the most important part, the cognition to "learning" make up the whole notion of "architecture"; as for business logic, including whether business functions are clear enough(to avoid ambiguity) and reasonable, the rationality of incentive mechanism, is it proper to assign a task to an employee, in all these fields we could apply "architecture".
以下重点讲技术架构。I would like to share more about technology architecture.
- 从技术的角度看，要达到某个目标，其衡量标准可以从 3 abilities 进行； From the perspective of technology, we could measure an architecture with such 3 abilities to see if it could reach a goal;
- 进而，可以通过所使用的技术（框架）对 abilities 的支持程度判断其优劣与适用性； Furthermore, we could determine a technology(framework)'s pros and cons or applicability by how it supports the 3 abilities;
- 再进而，工程师对具体技术的掌握程度来安排岗位。Lastly, assign the most appropriate post to a software engineer according to his/her specific skills.
The above are only a few thoughts, there are many other aspects to consider when we are measuring a system's good and bad parts in terms of the architecture, like this mindmap:
所以，要评估一个技术的架构是否良好，只要这 7 个方面表现良好了，架构就是良好的。
Therefore, to estimate if the architecture of a system is good or not, I believe that as long as such 7 aspects are good, it is good.
(to be added)
Some duties are ignored deliberately, relating to market, tech vista, connection with other companies, etc.
Title: 工作职责(duties) 人(employees)->事(tasks): 优于(prior to) Note over 人(employees): 招人，裁人(recruit, lay off)；\n鼓励人，安抚人(build teams) Note over 人(employees): 结构上可替换\n(make replaceable) 事(tasks)->技术(tech): 优于(prior to) Note left of 人(employees): 工作职责分对内和对外两部分，在对外事务中，\n“事”-“技术”-“金钱”的优先级别需要调整\n(priority adjustment on tasks,\ntech and money when \ndealing with outside events) Note over 事(tasks): 设置产品或项目的优先级\n(set priorities for products, projects) 技术(tech)->金钱(money): 优于(prior to) Note over 金钱(money): 合理花费(reasonable expense) > \n节约或过度花费(save or squander) Note over 技术(tech): 做产品而非做项目；\n文档一致性；开源贡献\n(do projects like a product;\ndoc sync; Open Source Contribution) Note over 人(employees),金钱(money): 部门协调，项目\n(depts coordination, \nprojects accomplishment)