武术发展商分类

被称为开发人员


在我的博客中,我互换使用了“程序员”,“编码员”,“开发人员”和“工程师”这两个术语,以避免重言式。 但是,我相信这些词与其他类似词之间存在一些差异。

在本文中,我们将讨论一组典型的名词来指定编写代码的人。 我将解释这些术语与精通程度之间的关系。

价值观的诠释


这里提供的定义不是官方的。 我不知道任何正式定义或公认的标准。 但是,许多人对此问题有强烈的看法。 我对每个术语的理解都是基于30年来在软件行业的经验,但是我绝对愿意让其他人不同意我的解释。

我不想争论或说服持有不同意见的人。 通常,很难说对与错的观点。 不过,如果您尚未就此问题形成立场,我希望本指南能够使您有所了解。

三方方法


为了清楚起见,每个术语将具有三个特征:

1.掌握水平


在我的解释中,该术语的技能水平描述。

2.平行于武术行列


类似于武术行列。 特别是,我们将技能的技术水平与武术家腰带的颜色进行了比较。

3.示例代码


这个级别的人应该如何完成简单的编程任务的示例。 这里的定义是微不足道的,并不打算作为现实的例子。 目的是比较和讨论技能水平。 为简单起见,选择示例以适合任何级别的专家。 这是我们将要考虑的问题:

计算整数之和

请跟我一起玩,把这个任务作为中间任务介绍,要困难得多。 在我们的虚拟世界中,一项任务需要认真思考,并且有许多潜在的解决方案和方法。 想象一下,这是您要扩展的系统的中央模块。

我将使用Ruby作为简单的实现示例。 代码非常简单:即使您不了解Ruby,也可以理解。

3.清单


讨论的名词:

  • 新手
  • 编码器
  • (骇客)
  • 程式设计师
  • 研究员(计算机科学家)
  • 软件开发人员
  • 软件工程师
  • 软件架构师

因此,让我们开始吧。

武术腰带




当我年轻时住在意大利(大约20公斤以前)时,我练习了柔道和功夫已有几年。 然后我了解到,在许多武术中,技巧水平与腰带的颜色相对应。 通常,颜色会从白色变为黑色,其中体验水平对应于皮带的暗度。

初学者因为没有经验而戴着白色皮带。 白色表示“新的和干净的”。 训练时,皮带变暗,显示进度。 颜色代表着辛勤工作和汗水积累的污垢。 具有多年经验的武术家最终走上了黑带,这意味着他们具有高水平的知识和技能。

传统上,皮带只有黑色或白色。 近几十年来,出现了更多的花。 今天,不同的武术学校使用不同的颜色。 该计划取决于风格,学校和国家。

我们为什么要谈论武术?


腰带颜色用于在软件技能和武术技能之间进行区分。 为此,请采用欧洲常用的配色方案:白色,黄色,橙色,绿色,蓝色,棕色和黑色。

下表显示了我所讨论的开发人员级别。 对于每种皮带,都显示了皮带的颜色和位置,通常将其提供给该级别的专家:

专业水平武术级别(腰带颜色)发布示例
新手
骇客街头霸王(无腰带)
编码器黄色初级开发人员(小开发)
程式设计师橘色软件开发人员
研究员(计算机科学家)绿色的软件开发人员
软件开发人员蓝色的高级软件开发人员(高级软件开发)
软件工程师棕褐色首席开发人员(首席开发)
软件架构师黑色的软件架构师

工程技能的水平与技术和团队合作能力有关。 该职位的标题是行业中如何称呼这个级别的人的一个例子(这在很大程度上取决于公司和地区)。

新手:白带




您必须从某个地方开始,通常这是“完全没有经验”的水平。 软件开发的新手是刚刚熟悉编程并处于培训初期的人。 初学者仍然无法自信地编程,也无法理解简单的程序,而无需检查书籍,教科书或寻求经验丰富的朋友的建议。

初学者能够编写有效的代码,但通常不了解为何使用此代码的细节。 他们花费大量时间在StackOverflow或类似站点上搜索代码片段,并将这些片段组合在一起,直到可以工作为止。

强大的工具不仅仅是可靠的技能。


使事情变得更加混乱的是,许多“现代”语言和框架允许任何人在不了解幕后情况的情况下生成复杂程序的结构和某些实现。 例如,可以使用命令行中的几个命令来安排启动一个简单的Ruby on Rails应用程序并接受HTTP请求。

这是在* nix下执行的方法:

$ gem install rails

$ rails new website

$ cd website
$ bin/rails server
...


做完了! 这足以使服务器响应来自浏览器的HTTP请求。 如果您将其与武术进行比较,那么这就是如何以盔甲和武器出现在榻榻米上的方法。 装甲将使您的寿命更长一些,并且使用武器可以赢得战斗。 但是,这样的胜利并不能使您成为合格的武术家。 这些工具使您无需进行传统的培训和工作即可简单地完成复杂的工作。

不要误会我的意思。 Ruby on Rails之类的工具可让您快速完成工作,它们很棒。 实际上,我发现减少编写初始标准代码所花费的时间非常棒。 这是该项目的一个很好的开始,但是仅仅一条白带就足够了。

真正的战斗从教程的结尾开始,那里的工具无法自动生成所需的应用程序。 要继续前进,您需要成为一名编码员。

例子


如果初学者想使用Ruby编写一个对一组数字求和的程序,那么他可以搜索问题并找到这样的页面 。 这是Google在撰写本文时的第一个结果。 在StackOverflow页面上,以524票的最高产答案:

 array.inject(0){|sum,x| sum + x } 

当然可以。 这是一个例子:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1, 2, 3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 

这可能适合初学者,但是他不了解此代码的功能。 它的可读性如何? 与其他选项相比,速度有多快? 容易维护吗? 为什么行得通? 执行此行时究竟会发生什么? 使用了多少CPU时间? 执行此行后是否定义了变量sumx

Ruby新手开发人员不知道大多数问题的答案。

编码器:黄带




编码器可以在没有外部帮助的情况下收集许多行计算机代码来解决简单的问题。 结果不会很漂亮,但是编码器理解了程序为什么工作,并成功完成了任务。

第一步


我之所以称其博客为CoderHood,是因为每个通过编程谋生的人都达到了编码人员的水平。 从第一个黄带开始,Coderhood一词就反映了技术人员在技术界的生活。

初学者和编码器之间的主要区别在于,编码器能够编写代码并理解它。 他们可能无法详细了解幕后情况,但是他知道为什么他只写了这样的代码。

在行业中,通常为编码器分配一个职位,例如“初级开发人员”(jr。Developer)或实习生(培训中的开发人员)。

例子


我认为“ Ruby编码器”将能够提出以下大多数方法来计算整数数组的总和并理解它们之间的区别:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1,2,3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 2.4.2 :003 > sum=0;array.each { |x| sum+= x } => 6 2.4.2 :004 > array. sum => 6 2.4.2 :005 > array.inject(0, :+) => 6 2.4.2 :006 > array.reduce(0, :+) => 6 2.4.2 :007 > eval array.join '+' => 6 

如果您有兴趣,这些方法中的一些方法会很糟糕,但是它们可以工作。

黑客:无腰带的牛仔裤




我被列入“黑客”名单是因为有人问我。 但这并不适合我们的讨论。

不是主要技能


我认为在软件开发人员的开发中,“黑客”并不是必需的技能。 这样的经验对于学习如何测试和保护软件应用程序和系统很有用,但是我在这里看不到对一般“技能水平”的描述。 我将其归类为活动的某个领域,而不是技术水平。 实际上,黑客的技能水平可以是任意水平。 其中一些很棒,而另一些则不是

由于黑客不是开发人员开发中的必要步骤,因此,以我的类比,黑客没有传统的束缚。 他们看起来更像是穿着牛仔裤的街头霸王。

他们中的一些人是邪恶的暴徒,其他人则试图生存,其他人则是保护其余人的好人,但大多数人介于两者之间。

许多类型的“黑客”


黑客有很多类型。 有些可以编程,有些则不能。 这个词的含义取决于上下文和使用它的人。 一些常见的定义:

  1. 坚持技术和编程亚文化的计算机专家。
  2. 可以出于恶意(黑帽)或研究(白帽)目的危及计算机安全性的人。
  3. 以最快,最肮脏的方式完成工作的开发人员。
  4. 研究,实验或研究与电话网络连接的电信系统,设备和系统的人。 这些黑客也称为phreakers。
  5. 一位合格的工程师在硬件附近工作,以便更好地控制系统,以便做好工作(即从设备中获取更多性能)或出于恶意目的(即使用安全漏洞并在手术室保护方面找到方法)系统)。

一些例子


类型3


3型黑客可以选择以下选项来对整数数组求和:

$ irb
2.4.2:001>'echo“ 1 2 3” / bc'.to_i
=> 6

该方法至少在某些系统上有效,但这是“完全破解”。 可以编程的非熟练黑客也是如此。 它们通常以执行不可读的命令行命令的方式解决问题,直到它们以某种方式获得期望的结果为止。

类型5


第5类黑客的工作水平很低。 这些技能不容易掌握,如果您试图配置软件保护或创建超高性能的应用程序,这些技能将非常有价值。 我从来都不是“黑客”,但是我以较低的级别(C和汇编器)进行编程,但我仍然发自内心地认为自己是底层编程的专家。

第5类黑客可能是出色的街头霸王,其疯狂的技能会擦掉许多专业程序员从事某些特殊任务的能力。 这样的“黑客”可以使用汇编程序像这样对整数数组求和。

程序员:橙带




程序员可以编写可运行的应用程序,了解基本算法并了解计算机科学的基础。 即使它不是很可扩展并且从长远来看也可以使程序正常工作。 通常,程序员可以很好地工作。 事实证明他将成为一个出色的团队合作者。

大多数开发人员都停留在此级别,特别是如果他们不打算学习计算机科学理论时。 程序员可以编写体面的代码,并在整个职业生涯中都可以在该级别的软件行业工作。

从工作的角度来看,程序员通常被称为“软件开发人员”或“软件工程师”。

在一个简单的整数数组之和的示例中,程序员可以通过以下方式编写代码:

 #!/usr/bin/env ruby if ARGV.size==0 puts "Usage: " puts " sum [  ,  ]" else puts ARGV.sum{|x| x.to_i} end 

此代码实现了一个有用的命令行命令来汇总数字列表。 如果不带参数调用它,它将显示有用的使用消息。 否则,打印标准输出。 这是一个用法示例:

$./sum
Usage:
sum [ , ]
$ sum 1 2 3
6


这是一个“完整的解决方案”,具有自记录性,并且有点抽象,因为可以从命令行调用该程序。

研究员:绿带




研究人员(计算机科学家)在学校或工作场所学习计算机科学。 他对这些概念有很好的理解:

  • 基本Base-N(N = 2、10、16)
  • 二元运算
  • 布尔逻辑
  • 算法复杂度和big-O表示法
  • 数据结构(数组,链接列表,B树,红黑树,队列,堆栈,哈希表,堆,集合,图)
  • 排序算法以及何时使用它们
    • 对NP完整性的基本了解
  • 基本的多线程算法
  • 内存管理和垃圾回收(仅因为您的编程语言负责内存管理本身并不意味着您可以跳过此主题)
  • 指针(即使您不使用C语言编写代码,也至少需要了解该概念)以及按值或引用传递参数之间的差异。
  • OOP概念(接口,继承,构造函数,析构函数,类,对象,抽象,封装,多态等)
  • 面向对象的设计和模板
  • 递归
  • 有关动态编程,贪婪和摊销分析,字符串比较和近似算法的一些基本概念

该研究人员拥有计算机科学学位,或者他从事开发人员多年,研究工作中的应用计算机科学。 如您所知, 我认为CS学位对于成功的发展职​​业不是必需的

仅凭“计算机科学家”的身份并不能使您成为优秀的程序员。 这里似乎违反了皮带颜色的类比。 但是事实并非如此。 换个角度思考:即使在武术世界中,也有专业领域。 有些绿化带在某些方面做得比另一些更好。 进度是非线性的。 腰带的颜色通常代表经验水平和掌握武术所花费的劳动量,而不是各个方面所需的技能水平。

科学家可能会写出与程序员相同的代码来计算数字的总和。 不同之处在于,科学家可以立即说出该算法的复杂度为O(n)时间。 如前所述,这是一个基本示例,但是您已经想到了。

软件开发人员:Blue Belt




软件开发人员可以处理更大,更复杂的项目。 与程序员和研究员相比,他:

  • 编写更整洁,更结构化,维护,记录和可读的代码。
  • 允许更少的错误。
  • 它工作更快。
  • 他作为一个团队工作得更好,并且了解开发过程的价值。
  • 更好地定位和优化代码和软件系统中的瓶颈。
  • 有更多经验。

例子


在整数的简单示例中,软件开发人员可以通过创建提供Web API的服务来解决该问题。 接口采用一组整数并返回总和。

我相信该应用程序将有充分的文档说明,并支持设置,进行测试,具有正确的代码结构并且可以由其他开发人员轻松维护。

在Ruby上,使用Sinatra的主应用程序可能看起来像这样:

 require 'sinatra' require "sinatra/config_file" # Load the server configuration from config.yml: config_file 'config.yml' # # EndPoints: # # /sum/n1 n2 n3 n4 ... # Return: # {result: [sum of n1,n2,n3,n4,...]} # # Example: # $ curl http://localhost:8080/sum/1 2 3 4 # {"result":"10"} # get '/sum/:numbers' do |numbers| {result: numbers.split(" ").collect{ |x| x.to_i}.sum}.to_json end 

优秀的软件开发人员与其他人相比,深知此解决方案的许多局限性。 例如,它限于适合URI的一组数字的总和。 没有明确的错误检查;行必须以数字开头,依此类推。

软件工程师:Brown Belt




软件开发人员和软件工程师之间的区别是微妙的。 我完全承认。 这些术语通常是同义词。 不过,我认为软件工程师是一位具有计算机科学知识和丰富经验的软件开发专家。 主要区别:

  • 能够创建更多可扩展的系统。
  • 长寿。 它们工作时间更长,问题更少。
  • 减少错误,提高代码质量。
  • 能够担任技术项目经理和团队。
  • 出色的协作和沟通能力。
  • 足够的软件架构知识来完成这项工作。

在公司中,此类开发商可能会担任“高级开发商”或“高级开发商”的职位。

例子


软件工程师可以通过创建服务并提供一个采用一组整数的API来以开发人员的身份编写应用程序。 但我相信工程师的决定将包括一些改进:

  • 缓存结果。
  • 从总和到查询中任何数学表达式的概念抽象。
  • 记录,认证,挂钩跟踪等

例子变得愚蠢


如您所见,在这个阶段过分简单的示例有点愚蠢。 归结为关于如何改进一个已经很冗余的琐碎问题的解决方案的讨论。

例如,用简单的操作对少量数字进行结果管理缓存最有可能比简单的计算更加困难和缓慢。 在将大量数字传递给API的情况下,缓存是有意义的,但是该列表不适合请求URI。

您可以将数字列表移动到请求主体,但是它将不再是RESTFUL API,并且将不再缓存请求。 在这一点上,将请求更改为POST很诱人,但是它永远不会被缓存。 无论如何,讨论可以继续进行。

关键部分


看看发生了什么事? 随着开发人员技能的提高和项目变得更加复杂,一件有趣的事情发生了。 问题越来越远离“核心代码”。 取而代之的是,他们越来越多地处理主代码在其中工作的上下文。

结果,高素质的开发人员会花费大部分时间来改善系统的各个方面,例如可伸缩性,性能,错误检查,可靠性,可维护性,抽象性,可移植性,边界条件的处理等。

此外,他们还将学习如何更有效地工作或改善与其他开发人员的互动,以及如何进行工作以最大程度地降低风险等。软件开发从编码转换为工程系统并解决问题。

软件架构师:Black Belt




所有开发人员和工程师都应该能够设计他们打算构建的系统和产品的各个部分。 “软件架构师”将这项技能提升到更高的水平,并在设计由其他工程师开发的大型软件系统的高层交互时做出选择。

例子


在我们的示例中,除其他外,架构师可以绘制这样的图来指导用于求和整数的服务的开发:



为了有效解决此类问题,软件架构师需要多年的各个级别的经验。 这种实践经验会进入肌肉记忆。 它使架构师可以做出正确的高层决策,而无需关注细节。

但是,我不相信纯粹的架构师,也就是那些在高层做出全职决策的工程师。 我认为,可靠的架构师应该深入到各个细节的层次,并在必要时摆脱困境。 他准备定期有效地研究代码。

在武术中,黑带是老师和指导者。 我认为培训和指导也是软件架构师的任务。 我所谈论的教学不是直接的(讲座),而是更多地通过示例来完成,展示了方式并指导人们做出决定。

结论


认真的战士终生学习武术。 认真的软件开发人员也会这样做。 我希望您的讨论对您有所帮助。 我希望它为一些定义不明确的术语提供了上下文,并且在理想情况下有助于解释如何更准确地使用它们。

Source: https://habr.com/ru/post/zh-CN418467/


All Articles