我们在寻找什么开发人员来开发1C:企业平台

我们的梦想是为开发全球业务应用程序提供最佳的工具包。 我们有很多很棒的想法,这些想法的实现使我们能够实现这个梦想,开发我们的工具以保持最佳状态。 好吧,要在适当的水平上实现这些想法,我们需要出色的程序员。

简而言之,我们正在寻找以下人员:

  • 喜欢(或准备喜欢)制作复制的框架
  • 想要制造成千上万人使用的产品

为了更详细地显示我们正在寻找哪些开发人员以及如何寻找他们,我们与公司的招聘经理进行了简短的访谈。 采访中的问题被问到:

  • 您需要什么样的开发人员?
  • 您要求面试什么?
  • 您在面试中更喜欢哪些问题-理论还是实践?
  • 程序员应该编写测试吗?
  • 您不是在专业活动领域问问题吗?
  • 您是否设置了与编程没有直接关系的逻辑任务以便快速思考? 关于汽车中带有氦气的球任务类型:


程序员可以在哪些领域从事我们的平台开发工作? 好吧,例如:


图片

互联网发展集团


图片

该小组编写的在线服务可能被数百万1C产品的最终用户使用。 例如,服务允许您通过TIN获取有关交易对手的信息,检查交易对手的可靠性等。 活动区域非常负责,服务在高负载下运行,服务停机非常不可取,因此我们尝试创建最可靠的产品。 我们还生产称为交互系统的产品。 这是一种在客户端应用程序和1C之间传输信息的机制。 借助它的帮助,尤其实现了内置在应用程序1C中的Messenger。

对于开发人员,我希望他能够开发整个产品-分析用户的需求,考虑架构,编写代码。 因为人们经常来采访,并说对我来说分析主题领域并不有趣,所以我希望分析师为我写一个TOR,根据该TOR我将对该功能进行编程。 也就是说,一个人只对编程的技术方面感兴趣。 我们尽量不要雇用这样的人,因为 我们有一个小团队,我们必须处理大量相关领域。 因此,与专业技能无关的主要要求是能够准确,准确地制定产品要求,通过实施进行思考,开发产品并对最终结果负责的能力。 个人对最终产品质量的兴趣很重要,因此个人可以制作自己想要引以为傲的产品。

在埃里克·埃文斯 Eric Evans )的《面向对象的设计》中,主要思想之一是,开发人员还必须是一名分析师,对自己自动化的主题领域有很好的了解,了解对企业有价值的东西,如果他不了解,那么他就不会将能够开发一个满足所有用户需求的良好系统 如果开发人员从主题领域进行抽象,那么他将不会对产品的体系结构做出关键决策,但必须执行这些决策,在这种情况下,存在实施质量低下的风险。 相同的Evans建议在领域区域中区分两个部分-对业务至关重要的那部分,使您的产品实际上是您的产品的那部分,以及对基础结构捆绑负责的不是很重要的第二部分。 最好的开发人员应该获得第一部分的重要实施。

面试进行得如何? 我们有一份问卷调查表,询问了有关申请人的10个问题。 问卷中的问题不是理论性的,而是实用的,例如-代码在此类堆栈跟踪中引发了异常,说明了您将执行的操作。 或者-您对运行缓慢的数据库进行查询(给出查询文本),有一个查询计划,请评估-该查询计划不好,您需要解释如何加快查询速度。 问一个人是什么类型的JOIN是没有道理的-当然,如果他甚至不愿意为面试做好准备,他就知道这些类型。 使用这些JOIN的实践经验很有趣。 如果一个人有分析查询计划的经验,那么他将不难谈论解决问题的方法,如果没有这样的经验,这本书将无济于事。 这是区分刚刚阅读该功能的开发人员和真正使用此功能的开发人员的地方。 我们对与第二种类型的开发人员打交道更感兴趣,我们希望此人立即“参与到游戏中”。

问卷中的某些问题已经停止工作,我们已用新问题替换了这些问题。 例如,前段时间,在面试中,他们经常要求实施Singleton模式,当候选人这样做时,他们说-现在变得懒惰了。 从那时起,哈布雷(Habré)上出现了几篇文章,详细描述了如何编写这类东西,人们只是心地学会了这项任务,而不再是对职业适应性的考验。

我们还希望开发人员能够胜任地编写测试; 例如,测试签名中描述了系统必须满足的合同签名。 例如,可以在Java中以Roy Osher推荐的样式来完成,将合同方法的名称分为三个部分:“给定”,“期望”,“结果”。 您可以使用SpockGroovy上进行操作。 应试者是否了解确切地需要测试什么,是否有必要测试边界值,是否知道测试金字塔等至关重要。

我们还询问有关人员参与的项目,尤其是他们是否使用了与我们相关的技术。 例如,我们使用Hazelcast ,到目前为止,几乎没有人在生产中使用它(来自Yandex.Money的最新大型实现),并且我们对有使用Hazelcast经验的人非常感兴趣。 此外,候选人可能会向我们揭示新技术出乎意料和有用的方面,而我们尚不了解这些方面。

对于我们来说,一个重要的主题是如何编写代码以在多线程环境中工作。 例如,在高负载环境中有多个应用程序节点,我们要求应聘者告诉您如何使系统可操作和可靠,同时最大程度地减少其阻塞。

程序员应该编写测试吗? 必须,但不是全部。 程序员必须无条件编写单元测试。 顺便说一下,我们团队中的成员不坚持强制使用任何方法,例如TDD ; 一些开发人员主动使用TDD,他们非常喜欢。 我们还编写集成测试。 开发人员还进行负载测试,为JMeter编写测试计划。

网络客户端开发团队


图片

尽管我们正在使用JavaScript开发Web客户端,但我们希望该候选人除了具有JavaScript的Web开发经验外,还具有开发“经典” OOP语言-C ++或Java或C#的经验。 这是由于项目的具体情况; 1C Web客户端,用JavaScript编写,但从意识形态上讲,它更类似于用OOP语言编写的应用程序。 我们用JSDoc注释覆盖了JavaScript代码,因此在组装过程中会进行静态类型检查。 选择这种方法是因为我们使用了Google Closure Compiler ,它特别有助于我们提高代码速度并减少代码消耗的内存量。 因此,OOP经验将对候选人有很大帮助。

在面试中,我们询问应聘者及其团队在以前的工作中必须解决什么任务,我们讨论由他实施的解决方案的体系结构。 我们询问候选人的任务,其中一些是机智和算法思维。 例如,有些任务是由大量代码“解决”的,如果您考虑一下,则只需一行即可。

在JavaScript中,有一组任务用于特定的布局知识。 例如,我们在一张纸上画一个HTML页面的结构(该结构可以是动态的,可以根据某种算法随时间变化),并要求编写代码来创建这种结构并以动态方式实现。

我们还尝试评估候选人对分析活动的倾向。 即使编写高质量的代码,但严格按照固定的技术规范运行,我们也不希望团队中有一个“干净”的编码器。 我希望开发人员参与到这些任务中,深刻理解产品中正在做的事情,以及理想情况下为什么它也是新功能的驱动者。

如果候选人是学生还是昨天的学生,我们可以提出纯粹的理论性问题,例如,提出OOP的基本原则或其他一些问题。 如果一个有经验的人,这样的问题可能毫无意义,应聘者很可能知道这些原理并将其运用到他的工作中,那么提出这些要求的要求可能会导致他陷入死胡同,因为他老实地忘记了教科书上的措辞。

每个采访都是唯一的。 与一个人就某些话题交谈,而另一人就其他话题交谈很有趣。 在访谈结束时,我们讨论了我们的产品,其使用范围(它们令人印象深刻-我们的系统拥有数百万的最终用户),我们关注人们的兴趣。

应用程序可伸缩性团队


图片

我们是谁


我们的团队是在1C:Enterprise平台上构建高负载系统的领域的专家。 这些工程师解决了可靠性和可伸缩性方面的挑战。 此类任务通常处于管理和开发的十字路口。 解决这些问题的结果是一个非常酷的系统。 此类任务的示例:

  • 在两个数据中心中部署容错基础架构并模拟故障
  • 通过将用户数量增加10倍来确保系统性能下降,将每小时成本的计算速度提高3倍,
  • 调查并消除出现的僵局,
  • 考虑到这些数据库之间的交换,确保在某个时间点协调恢复十几个分布式信息数据库。

这不是完整的任务列表。 令人欣慰的是,许多任务都带有这样的措辞:“是否有可能做到这一点?” 即 人们起初不相信。 我们不争辩,总是试图说服尝试实践,去做。 为此,我们需要愿意在半夜连接到大型客户端系统,因为本地工程师已经破坏了某些东西,没人知道该怎么做。 不止一次需要在没有备份的情况下恢复被破坏的基础,或者找出为什么系统负载增加了5%。 如果您愿意,您甚至可以阅读有关我们工作的评论

我们在找谁


我们正在寻找热情地想做不可能的工程师。 对候选人而言,最重要的要求之一是要有双眼,渴望,并有能力利用现有知识快速了解他以前从未遇到过的事情。 这些都是可靠性工程师和开发人员,他们合而为一。 想象一下,一个客户正在与数千名用户联系,并告诉您,他正在尝试将其工程师在一年中开发的复杂机制投入运行。 顺便说一句:

  • 面对客户业务不断变化的需求,尚未完成开发;
  • 尽管关键实施机制的开发正在紧锣密鼓地进行,但工程师们尚未达到成千上万用户的测试机制。
  • 直到现在,没人知道为什么随着这种实现的用户数量的增加,正是在这种机制下,生产率急剧下降;
  • 开发是在Windows上使用MS SQL Server DBMS进行的,在最后阶段,做出了一项政治决定,决定在CentOS中实施PostgreSQL,而DBMS成为导入替代趋势的中心。
  • 您不小心发现甚至有10个用户工作时也会超时。
  • 您需要为此机制计算设备,因为客户上个月必须购买了该设备。
  • 您了解到,您需要在这种机制中制定算法的并行实现,与同事进行协调,共同确定准时的工作方式,而不会引入新的错误。

是的,再三:并不是每个人都准备好帮助他们确定决策中的错误和反模式,因此您需要能够与最近几个月持续紧张的工程师进行外交上的沟通。

我们看起来如何


面试对候选人可能有压力。 但是,即使您不考虑和利用所有现有经验,也无法将这种压力与真实情况下的压力相提并论。

许多候选人的问题是他们不知道如何运用自己的知识,也无法解释自己的六岁孩子。 这就是为什么在面试期间我们会定期要求您教给我们一些候选人最精通的知识。 自然,我真的很想招募我们可以学到很多东西的人。 在这样的讨论中,知识的深度和很好的理解非常重要。 早上7点,我们面试了候选人,讨论了MS SQL Server中的内存管理组件,并最终决定了理解页面和范围的经历。 然后HR干预说:“我们用什么折磨他?! 谁知道呢!?”,我们离开了房间聊天。 一位昏昏欲睡的打呵欠的同事不经意间穿过走廊朝着咖啡的方向走去。 向同事询问了相同的问题,他基本上清晰,正确,正确地回答了问题,而没有睁开眼睛并继续打哈欠。

自然,我们尝试测试数学和算法知识。 相反,它们与基础知识有关。 但是,对分布式算法的了解以及在任务中应用这种算法的能力将是候选人的肯定优势。

另一种方法是要求应聘者代替1C开发人员介绍自己,并要求他实施某种应用的任务。 在面试和候选人压力下,这种任务使您能够了解候选人的想法。 我们查看候选人的解决方案,帮助候选人查看其解决方案中的重大技术问题,然后查看候选人如何更改解决方案,而不允许其他技术问题。 有时我们进行6-7次迭代,寻找并评估解决方案的弱点。 同时,不仅可以讨论和理解一个人对死锁的了解,而且还可以理解在他的代码中如何将其发生的可能性降低到零,这立即成为可能。

对特定编程语言的了解并不是一个非常重要的因素。 当一个人考虑使用一种语言进行编程时,这很重要,而不仅限于语言结构。

工作中使用了什么


第一个也是最常用的工具是1C:企业技术平台。 在管理员和开发人员级别需要平台知识。 即 您需要了解如何实施特定的解决方案,并在成千上万的用户的系统中运行它。

通常需要分析MS SQL Server和PostgreSQL DBMS的操作,因此使用分析工具,动态视图和杂志是活跃技能的一部分。 在这里,大量工作的能力很重要。 当使用计算机生成的查询及其计划处理1 TB文本日志时,标准的Windows记事本不是很方便。 立即需要正则表达式以及支持它们的整套工具和语言的知识。 要分析查询计划,您需要了解什么是索引以及合并联接与哈希联接有何不同。

企业市场中的系统通常在Linux上运行。 服务器上没有图形环境。 控制台技能非常重要。

想象一下您需要查找为什么Postgre进程在CentOS中的PostgreSQL服务器上的CPU负载增加了5%。 尝试在纸上写下您调查的算法。 马上就知道需要什么


对我们重要的是


一个人要进行大规模思考并始终试图看到全局,这一点非常重要。 例如,大多数候选人解决​​了对文本文件进行排序的任务,提供了一种适用于对10 MB文件进行排序的算法。 但是,当他们面对内存和磁盘空间有限的情况下对10 TB文件进行排序时,他们的理解和观点会发生很大变化。 而且您需要记住,访问磁盘的成本高于访问内存的成本。 我真的希望候选人在所有任务中都“大规模”思考。

1C:企业平台开发小组


图片

候选人对我们团队的主要要求是具有分析思考能力,彻底分析问题的能力以及衡量解决方案的能力。 1C:企业平台具有相当长的开发周期(数月),因此不可能像在Web开发中那样逐步实现部分功能。 这要求在考虑实现细节时具有深入思考的能力,您需要尝试“一次完成”。 即 不要使用我昨天在哈伯(Habr)上读到的第一个可用方法来解决该问题,而是要仔细权衡各种解决方案的所有利弊。

在面试中了解候选人是否具有这样的素质并不是那么简单。 最相关的方式是谈论候选人的过往经历。 当一个人告诉他想出了什么很酷的解决方案时,我们会问-实际上解决了什么问题? 为什么选择这个特定的解决方案而不是另一个? 如果问题的条件有所改变,解决方案将如何改变? 通过问几个类似的问题,您可以了解这个人对主题的沉迷程度。

短语说明了另一个方面:“我们雇用了知道如何工作的人,然后出于某种原因我们希望他们想工作。” 因此,在面试中我想了解一个人的工作是什么。 如果对他来说,这是一种令人愉快的消遣,可让您赚钱,那么候选人很有可能不会有好的结果。对于大多数专业开发人员而言,他们的工作是他们曾经要做的最有趣的事情,即研究,渴望和创造新事物的能力。来找我们的人必须准备好学习,学习和学习。我们不仅需要表演者,还需要永远不会厌倦学习的人们,我们必须在工作中不断学习。

您还希望与该候选人一起看到的是工程技术,即具有比喻意义的从多维数据集组装出优雅解决方案的能力。

所需的编程语言知识取决于正在寻找候选人的平台开发领域。该平台的核心是C ++和Java,Web客户端是JavaScript,希望了解C ++的基础知识,一些项目需要1C的知识,但是其他语言和技术的知识是非常可取的。我们必须为1C世界创造许多新事物,我们希望开发人员的视野和博识使他们能够使用其他语言和技术中发明的思想和概念进行操作,并了解在开发1C解决方案时如何在正确的位置正确地正确应用它们。例如,要开发我们的云产品1cFresh我们在1C中编写了主要用于管理的各种工具(在1C中,它们的开发速度比传统语言要快)。如果开发人员了解系统管理员(bash,Python,Perl)使用的技术和语言的模式,这将有助于他创建易于使用的工具。

如果我们在采访学生,我们可以要求他计算他的积分并解释为什么要考虑积分。普通的高年级学生已经不记得积分的含义了,一个有责任心,热情的学生很好地记住了含义并且可以解释它。

如果我们有系统管理员,则可以询问例如在Linux中操作RAM的特殊性。如果某人使用DBMS,例如,我们会询问存在什么级别的事务隔离,哪个候选人更喜欢使用它,以及原因。例如,如果某人正在同步多个数据库,我们将与他讨论如果突然从备份中恢复了一个同步数据库之一该怎么办。一个典型的体系结构问题可以用不同的方式解决。

我还希望看到改变世界的愿望,以求更好,更健康地分享完美主义。没有足够数量的完美主义,很难编写可以在非常不同的实现中使用多年的代码。

程序员应该编写测试吗?程序员必须发布有效的产品。如果他是一名成人程序员,那么没人会关心他是如何做到的。如果这是新手程序员,建议他编写测试。一个认真的开发人员最终开始理解应该为他创建的代码编写哪些测试,在哪些薄弱的代码部分可以更好地覆盖测试。我们反对盲目地进行全球测试。该程序可以正常工作,不是因为它已经完全覆盖了测试,而是因为开发人员转过头来。测试是一种辅助工具,可以防止程序最困难的地方出现错误。我们必须记住,测试不是解决架构问题的灵丹妙药。最重要的是,一个人应该抬头。

在非IT问题中,有时我们会问这个问题-一个人在3-5年内会看到谁?我们相信,如果一个人的发展愿望与公司如何看待他的发展,我们将与他一起工作。

评估两件事至关重要。首先是一个人现在所处的位置,他现在所拥有的经验和知识,他现在可以解决的任务水平。第二个是处于有利环境中的人准备在几年后成为什么样的人。因此,当然,这些年来,他在我们公司工作,解决问题,专业成长。我们更感兴趣的不是不是一个人现在是什么,而是他在一两年,三年后会成为什么样的人。对我们来说,前景总是比当前的状况更重要。对我们来说,一个有前途的新人比一个有成就的人更有趣,但是他的眼睛呆滞。

1: –


我们通常会在提问时开始采访-您最感兴趣的项目是什么,您最喜欢的项目是什么?我真的想立即了解是什么使一个人在工作中变得光亮,以及他一般是否在工作中发光。

然后他想知道一个人是否必须像他一样优化程序的性能。

我们问候选人在他的项目上使用了哪些测试方法,他如何建立测试项目的策略,我们可以问-我们有一个具有这种声明功能的系统,我们将如何测试它?

如果访谈是针对Java开发人员的,我们会询问垃圾收集器的工作;开发或多或少复杂程序的人应该意识到自己工作的细微差别,以及如何编写代码以使垃圾收集器有效地清除垃圾。

在非程序员主题中,有趣的是要问业务-从业务的角度来看,应聘者最喜欢的项目解决了什么任务,它带来了什么好处。对于开发人员来说,看到全局是一个非常有价值的属性。一旦有候选人制造了区块链,他的故事就很有启发性。

我们设定设计任务,要求应征者设计一个简单的系统。然后,我们一起查看项目,查找缺陷,讨论如何消除缺陷。候选人如何回应评论非常重要。

一定要谈论我们在做什么,也就是说,我们正在制作1C:企业平台。我们讨论如何在诸如服务器群集移动平台上的高科技产品上工作

我们不强迫考生在纸上写代码。但是我们在面试过程中在纸上画了很多东西,画了系统架构,模块图以及它们之间的交互作用。

特定语言的知识并不重要。碰巧的是,一个人以C ++开发人员的身份进入公司,成为C#开发人员,并且很快就学习了C ++。有许多同事在工作过程中学习新语言的例子。如果有一种语言的愿望和知识,那么学习一种新语言就不是问题。

我们还要求一个人阅读Habr和stackoverflow,甚至阅读有关某专业的书籍,以及哪些书籍。有时我们以这种方式找到有用的书。

报告机制发展小组


图片

我们需要铁杆C ++开发人员。我们的团队致力于报告机制,这意味着我们的代码可以处理大量数据,并且需要容器和算法方面的丰富知识。

在面试中,我们询问-候选人在工作中使用了哪些图书馆,哪些算法。我们经常使用STL,因此我们一直在积极地询问该库,开发人员从中使用哪些容器执行哪些任务。例如,我们要求您编写将特定类放入map中的代码,以及一些其他类似的任务。对于此类任务,您可以立即看到程序员在我们面前的地位。

关于编程理论的问题很少提出。我们认为,实践知识更为重要。如果一个人能够很好地解决问题,并在实践中成功地运用了这一理论,那么他就不会记住OOP基本原理的确切表述就不再那么重要。

顺便说一句,如果一个学生来面试,由于缺乏经验而仍然难以完成所建议的任务,我们将对此给予优惠。在理论上驱使他,询问他的职业兴趣已经很有意义。如果一个人看起来很有希望成为专家,那么给他机会与我们一起发展成为一个优秀的专业人员是很有意义的。

对我们而言,一个相当重要的标准是了解他人代码的意愿。 1C:企业平台是一个大型产品,有超过1000万行代码,在日常工作中不可避免地会与该代码发生冲突,至少是在将您自己的代码嵌入其中的水平上。

我们问候选人如何更喜欢被赋予任务-以详细说明的形式,或者只是以“执行某一种机制”的形式设置。我们理解并接受这两种方法,我们不会仅仅因为一个优秀的程序员需要咀嚼问题陈述就拒绝它。对我们而言,立即了解如何与他人合作非常重要。但是我希望员工在将来朝着更大的独立性方向发展,能够对另一个方向负责。我可以举例说明动态列表图表。我希望员工制定这个方向-找出该机制用户的需求,在论坛和会议上与用户进行交流,编制新功能列表,对其进行优先级排序,了解该机制的问题并提出解决方案。如果有兴趣的人,他可以发展为团队负责人,首先是指导我们年轻专家中心的实习生,然后再领导他的团队。好吧,如果一个人天生是一个“干净”的开发人员,他更喜欢传统知识的工作,并且对了解用户的需求不感兴趣-那么,我们需要这样的人。

程序员应该测试吗?当然可以!不做测试的程序员就像不做准备的厨师。当然,您不能要求程序员在所有受支持的环境(Windows,Linux,macOS,Web和移动客户端)上完成测试,但他必须验证当前操作系统的基本功能。好吧,如果您编写自动测试,那就更好了。这将是一个现成的回归测试,它将落入测试库并在代码的相应区域中更改时将定期运行。

1C开发小组:企业开发工具


图片

1C:企业开发工具是用Java编写的,我们正在寻找具有Java知识的开发人员和测试人员。我们正在寻找有双眼的人,既有专业人士,也有潜力的初学者。 Java知识对我们来说是必不可少的,算法和数据结构,多线程编程等知识对我们来说也是必不可少的。不幸的是,在我们的团队中,我们等不及要等到新的开发人员了解这些内容。但是了解我们使用的特定框架(EMFXtextGEFLuceneHandly等)是很便宜的。如果您看到一个人很清楚自己和与他交谈的舒适程度,则表示他会适应团队并迅速获得必要的知识。

一般而言,适合团队以及专业精神可能是我们的主要标准。我们的团队是一个狂热的团队,我们不想与其他性质的人一起稀释它。而我们团队中一个性格不同的人可能会感到不舒服。对我们而言,明确的危险信号是一种无礼的交流方式。一个人可以是一个非常好的专业人员,但是如果他不能与同事进行尊重地交流,那么他将不适合我们。我们有一个游戏-纯粹是一个团队。

研究所教育的特殊性在于,研究所的群众不教授工业程序设计。他们教授语法,语言构造,算法。但是,几乎没有在任何地方教授编写文档的随附代码的能力,其中包含开发,可扩展性的可能性。因此,在面试中,一项非常重要的任务是设计任务。例如,我们询问候选人如何编写俄罗斯方块,项目将划分哪些组件,他将设计哪些接口以使组件彼此交互。接下来,我们使介绍性入门变得复杂-例如,我们说俄罗斯方块将是三维的(或者将添加新类型的形状,或者形状将从不同侧面掉落),并查看所选设计如何适应不断变化的条件。一般来说,面试的主要任务之一是了解候选人可以思考的灵活性和广泛性。当然,程序员应该编写测试,至少要进行单元测试,而集成测试会很好。设计任务的标准问题是如何测试设计的系统?

好吧,对于测试人员来说,广泛思考的能力更有价值!有个众所周知的笑话,测试人员如何测试酒吧:订购了1杯啤酒,2啤酒,0啤酒,999999999啤酒,–8啤酒,qwertyuip啤酒,并将项目提交生产后,客户去了酒吧并询问在哪里厕所吗 测试人员的主要技能是提出非标准(同时也是现实的)方案;通常,标准脚本由开发人员自己开发。

结论


如何不在此处提供打开职位空缺链接:)

您可以将简历发送至job@1c.ru

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


All Articles