外部董事聘任书
我是拥有超过13年专业经验的Fullstack开发人员。 我将.NET / .NET Core用作主要工具,并且也对前端开发充满热情。 我精通将香草JavaScript与Angular框架(自AngularJS 1.3版本开始)一起使用。 作为全职高级开发人员。
在本文中,我想分享我在技术招聘方面的最新经验。 我对整个过程以100%的分数通过筛选的整个过程提供了一些见解,如果您是开发人员的同伴并希望对整个过程有所了解,我认为这将非常有用。
招聘人员在LinkedIn上的推广活动–开发人员的日常工作
我不是一个特别喜欢社交网络或在网络上暴露过多的人。 维护多个社交媒体资料并使用社交应用程序可能会很累,并给本已喧闹的现代网络生活带来更多噪音。 我很久以前决定保持自己的个人资料整洁,不时检查一下,以免压力。
我仍然每周使用的唯一网络是LinkedIn。 尽管LinkedIn上存在很多可疑的内容,但始终有一些人,帖子,文章和商业报价的鲜明例子,这些年来,这些故事仍然让我回到LinkedIn。
如果您正在阅读我的文章,那么您成为开发人员或有志成为一名开发人员的可能性就很高。 无论哪种情况,如果您在某处有社交媒体资料,都会招募大量招聘人员,也可能会与您联系。
说到招聘人员的LinkedIn推广,无论成功与否。 现在,请不要误会我的意思,我不希望所有东西都可以放在银色的盘子上,但还有很多地方需要改进。 我最常遇到的问题是:
- 我的个人资料和项目之间的技术堆栈完全不匹配;
- 招聘人员在最初的消息或会议之后没有回复;
- 没有关于这项工作的具体细节;
- 招聘过程将永远持续下去;
- 涉及的人员过多或流程的各个阶段等等。
至少根据我的拙劣经验,遇到真正知道如何应对开发人员的复杂过程的招聘人员的可能性要小得多。 这可能是一个令人惊讶的声明,但与经验丰富的招聘人员联系既使我感到轻松又是一次很好的改变。
礼貌的“不”如何变成工作机会
![](https://i-blog.csdnimg.cn/blog_migrate/475980865b5c70722509218d3cfb39f7.png)
我很清楚,时间是我们最宝贵的资源,没有人喜欢回应十几个工作机会。 如果您已经有一个令人满意的工作场所,招聘人员发出的消息在您看来就象是垃圾邮件-因为您不希望换工作。
当涉及到我时, 回复这些消息感觉很不错 – 首先,这是基本的社交礼节,其次,招聘人员可能会将我标记为至少在一段时间内不应该受到报价困扰的人 。 我经常阅读这些消息,但由于有些工作而分心,完全忘记了回复。 或者我只是将所有消息标记为已读,冒着错过好机会的风险。
几周前,在我稍事休息的时候,我打开了LinkedIn,并通过通知轻而易举地打开了消息传递中心。 一切都像往常一样–某些赞助内容和一些普通信息到处都是。 但是,有一条消息引起了我的注意。 这是非常简短但友好的。 它包括简短的职位描述,薪资范围,并且很清楚地表明我的个人资料已被签出 ,我非常适合这份工作。
消息来自ITCraftship的首席执行官Maksymilian Majer ,我后来才发现-这是一家位于波兰的技术招聘机构 。 他们的网站在我看来是合法的,提供了有关他们招聘过程的大量信息。 此外,快速浏览Maksymilian的个人资料也使我对他们的公司充满信心。 他不仅是首席执行官,还是具有很强技能的软件开发人员,这一想法使我决定发送回复。
ITCraftship的工作机会表明,他们需要具有强大JavaScript技能,Angular知识以及NodeJS和混合移动开发(不是强制性)经验的开发人员。 但是,他们正在寻找一名全职开发人员,并且由于我没有离开目前的工作,所以对我来说,这看起来像是一个大问题。
我以一种礼貌的方式向我解释说,我对现在的工作不感兴趣,但是我可以做一些兼职工作,因为我对给定的技术体系有丰富的经验。 我收到的肯定是肯定的答案使我感到惊讶。 我收到了要申请的链接,并附带一条便条,即如果我通过了招聘流程并证明自己很合适,那么兼职就可以了。
常规JS开发人员招聘过程的要素
申请报价很容易。 简单,互动的表单即可提交我的基本数据和简历-就是这样。 填写此表格将导致一封电子邮件,指出我的申请已成功保存,并且在审查该申请时会通知我有关下一步的信息。 2天后,我通过电子邮件收到回复,并链接到日历以设置我的技术面试时间。 快速无痛。
下一步是技术面试 ,一切顺利。 它是由技术招聘人员Mikołaj主持的,Mikołaj是一名软件架构师和软件开发人员,他的专长是各种各样的技能。 他的问题清晰明了-更重要的是,它们非常理智,具有实际意义。 我没有压力。 和以前一样,我的采访结果通过电子邮件和实用的评估任务Swift得出。
分配文件“ ITC-JS-Developer-Home-Assignment”可以在下面找到–为了隐私起见,删除了GitHub用户名。
![](https://i-blog.csdnimg.cn/blog_migrate/6876a2ed47c1d0908f515c0edbb57de5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b38961a43fab9bb6a09424e1056beb26.png)
如您所见,所有必要的信息都对它进行了清晰的解释。 您具有应用说明,所需功能,API文档,评分系统以及有关如何与团队共享您的解决方案以供审核的说明。
再次阅读作业,我注意到任务本身是经过深思熟虑的。 它一点也不复杂,而且完全实用,就像一项常规任务一样-开发人员可以期望每天进行处理。
我的代码分配方法使我加分
我敢肯定,这项任务可以在几个小时内解决,也许只需坐一会儿即可。但是,有一份固定的工作和安排好的周末使得这有点困难。 对于此类任务,不应有仓促的地方。 采取一些下午的会议(每次3个小时)来解决这个问题,这将是更现实和更理想的情况。
我最初的计划是这样的:
- 第一天:实施大多数(如果不是全部)功能
- 第二天:清理代码
- 第三天:进行测试,打包应用并发送以供审核
读完作业后立即引起我兴趣的一件事是评分系统 , 尤其是Angular + Ionic的奖励积分 。 当然,我会使用Angular开发我的应用程序,但我对Ionic框架并不那么熟悉-我真的很想获得这些额外的点。 由于这是学习新知识的好机会,因此我决定付出更多的努力,并尝试在解决此作业的同时学习一些离子基础知识。
更改方法后,该计划如下所示:
- 第一天:使用Angular实现所有功能
- 第二天:重用Angular代码并准备Ionic应用程序
- 第三天:清理代码,进行测试,打包应用程序并将其发送以供审查
我决定硬着头皮,尝试获得这些额外的积分-尽管5积分不是那么多,但我认为面试官应该考虑我在学习离子基础知识方面所做的努力。 另一方面,完成作业所花费的时间将用于尝试和学习新知识。 因此,这对我来说丝毫不费吹灰之力。
我估计完成任务不应该超过9个小时,这比一个工作日略多。 我可能要面对的潜在障碍是在编写Ionic应用程序时完全失败,但是在那种情况下,我仍然有回落到最初计划的余地,并可以将普通的Angular应用程序作为解决方案。
我如何完成工作–计划实施
在这一部分中,我将尝试着重于解决分配过程的几个方面。 它无意成为分步教程–我将尝试仅指出实现的一些更重要方面。 有关完整参考,请使用可在GitHub上找到的完成项目。
这些是开发/运行应用程序的要求:
- 安装NodeJS
- 安装角度
- 安装谷歌浏览器
- 使用一些代码编辑器-我更喜欢Visual Studio Code
第一天:Angular应用
创建一个新的Angular应用程序:
![](https://i-blog.csdnimg.cn/blog_migrate/0b5f8f757e05bface5ecf6927a7e72dc.png)
使用定制库
作为开发人员,在处理多个项目(无论大小)时,您很可能拥有多个定制的库,这些库负责处理应用程序的某些特定方面。 在此类库中最有可能处理组件,表单,错误,导航,各种帮助程序和自定义脚手架。
看着新创建的Angular应用一点也不令人兴奋。 默认应用程序没有我经常使用的任何甜食,可能会引起反感。 自然,我总是很想从现有项目中提取我的一个库,只是为了使开发更快一些。
在十几个案例中复查面试任务将是有问题的,没有帮助的。 自定义库可以解决超出此分配范围的问题,并引入其他代码。 在这种情况下,对于审阅者来说,可能意味着更多的东西来分析和/或引入更多松散的结局。 将它们放在NPM上似乎也没有改善。 坚持使用众所周知的第三方库通常是一个更好的主意。
向Yelp API发出请求
为了使用Yelp API,您将需要具有一个API密钥,该密钥将用作承载令牌并随每个请求一起发送。 为此,我们可以实现Angular HttpInterceptor。 诸如API密钥之类的硬编码信息从来都不是一个好主意,因此我只是将其放入环境文件中。
![](https://i-blog.csdnimg.cn/blog_migrate/fd472d7feb80a39e3e9c749335f819ad.png)
处理开发中的CORS问题
调用与我们的应用程序不在同一个域中的API会给我们浏览器带来烦人的CORS错误。 为了避免该问题,Angular使我们能够使用小型本地服务器,该服务器将按配置捕获并代理任何ajax请求:
![](https://i-blog.csdnimg.cn/blog_migrate/da11a9d551886ca022b7c77bbd537a14.png)
处理生产中的CORS问题
无法在生产中使用Angular代理,因此我需要一劳永逸地解决CORS问题。 第一个想法是编写一个微型Node服务器,它将为我的应用程序进行代理。 但是,这超出了此分配的范围,将需要付出更多的努力。 作为替代,我只使用简单的Heroku代理作为baseUrl变量:
![](https://i-blog.csdnimg.cn/blog_migrate/23ebf286debacffc478c2a527ac7c639.png)
YelpHttpInterceptor很聪明,可以根据环境决定使用哪个代理。 大。
有了正确的代理配置,我终于可以实现此分配所需的Yelp API调用:
角度服务
在应用程序中,我定义了三个简单的Angular服务:
- LocationService基本上是浏览器的导航器和本地存储(在下一阶段使用@ ionic / storage)API的包装,以仅读取地理位置数据并将其缓存到本地存储(如果需要)。 另外,还可以保存用户给定的位置数据(街道,城市等)。
- NotificationService包含两种用于显示成功或错误消息的简单方法。
- YelpService同时使用以前的服务(位置和通知)以及Angular的HttpClient进行远程API调用。 它包含用于搜索企业,检索所选企业的详细信息和评论的方法。 在搜索企业时,Yelp API希望以地理位置数据或确切地址为起点。 因此,我实现了searchBusinesses方法来从LocationService读取地理位置数据,然后根据用户的选择采取行动,要么使用GPS中的地理位置数据,要么使用用户提供的地址信息。 为了获得更多便利,我在获取Yelp业务时使用了分页。 实际上,此方法最复杂,但使用RxJS可使代码可读性强。
第2天:Ionic应用
今天,我将创建一个新的Ionic应用程序,并将昨天编写的大部分代码放入其中。
安装Ionic非常简单:
![](https://i-blog.csdnimg.cn/blog_migrate/229823302b435dfe4e6029944ff7d8ac.png)
之后,可以创建新应用程序并以以下内容启动:
![](https://i-blog.csdnimg.cn/blog_migrate/b18359a54064d67a53328907f7b09ff7.png)
我们可以为应用程序选择3种模板类型:空白,选项卡和侧面菜单。 有关更多信息,请阅读官方Ionic文档。
令人惊讶的是,至少在我的简单案例中,使用Ionic确实非常容易。 最复杂的页面是SearchPage,因为它包含使用反跳和无穷大虚拟滚动进行分页进行的搜索,并且花了我一段时间才能使其工作。 除此之外,Ionic文档非常好,并且很容易在几个小时内启动并运行该应用程序。
第三天:清洁,测试和部署
清洁用品
由于实施Ionic应用程序非常成功,因此我将精力集中在阅读更多文档上,以使代码更具可读性并删除我所做的一些实验。
测试中
我打算做一些简单的组件测试,仅作为示例,但与此同时,我在Medium上阅读了非常有用的文章“使用CodeceptJS,Docker Compose和Semaphore CI进行BDD风格E2E测试简介”,并决定使用CodeceptJS进行制作。简单的E2E测试。 我以前对CodeceptJS并不熟悉,但是在阅读了Maks的文章并看了Codecept的文档后,我决定尝试一下。
安装很简单:
![](https://i-blog.csdnimg.cn/blog_migrate/4182886ad02505e10064ab9c6819e2e2.png)
然后,我开始进行交互式初始化:
![](https://i-blog.csdnimg.cn/blog_migrate/be6b9ec9d5e5859aa8f03d4a384fb617.png)
在应用程序运行时运行测试:
![](https://i-blog.csdnimg.cn/blog_migrate/11d0a1fcc3f219e2f75645502eb88413.png)
对于整个配置,请看一下codecept.conf.js文件。
为了能够更轻松地运行测试,我在package.json文件中更改了测试命令。
![](https://i-blog.csdnimg.cn/blog_migrate/2f231228652751dee067c7682f6a5009.png)
CodeceptJS将使用输出目录来存储测试结果屏幕截图。
让我们看一下测试:
![](https://i-blog.csdnimg.cn/blog_migrate/7c943b61a55571f2561eaaa905fe860a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b1eef4c52a8cdacfca28abdcb36832d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2d4015550c22f7ddfb41ccba3102a0c5.png)
现在,这些是好看的测试,不是吗? CodeceptJS使其可读性强且易于遵循-您只需阅读一次测试就可以全面了解应用程序的行为-这太荒谬了。 我确实有一些小烦恼(请参阅测试注释),但是我很高兴我可以使用Codecept,并且将来肯定会更多地使用它。
部署方式
为了完全确定我的应用程序可以正常工作,我决定将其公开托管,以在Internet上提供。 这超出了分配的范围,但是这样做,我想我也很可能会获得一些额外的加分。 此外,这是一个很好且有用的做法。
当特别是在GitHub上有一个可以快速测试项目的演示页面的链接时,我真的很喜欢它。 在没有可用的演示应用程序的情况下,您偶然发现了一个有趣的库有多少次? 从GitHub中提取它,运行npm install并启动测试应用程序只是为了尝试该库? 您应该始终为潜在用户提供便利。
另外,您极有可能避免出现以下情况:
![](https://i-blog.csdnimg.cn/blog_migrate/b8435a53c216ab2283e5061cdcba1dab.png)
同样,我处在十字路口-我什至应该部署我的应用程序? 我应该使用NodeJS吗? 做一个Docker? 使用Heroku? 制作Vultr服务器实例? 如何以尽可能少的精力来完成它并使它适合任务? 好吧,如果您在“奖励积分”部分查看初始报价,则会有一个简短声明:
云和无服务器架构技能(尤其是Firebase)
这是我需要的答案! 我要做的就是将应用程序托管在Firebase上。 确实花费了大约15分钟来遵循本教程 。 我的简单应用程序可从该URL获得。
结语
将我的应用程序部署到Firebase之后,我要做的就是将我的代码与一个简短的README.md文件一起推送到GitHub ,其中包含一些针对面试官的提示。 该应用程序是在大约8个小时内编写完成的,没有Ionic的先前知识,因此存在一些问题。 另外,我也没有花任何时间来调整设计和优化CSS,尽管该应用程序具有完整的功能,但外观和感觉都不是值得夸耀的。
Homestretch-发表我的结果后的最后一次采访
由于我从其首席执行官马克西米利安(Maksymilian)和首席运营官Maciej那里听到了有关该公司的更多详细信息,以及我可能从事的潜在项目的更多信息,因此最终面试非常有益。 面试的技术部分完全专注于我的应用程序和代码。 一些不太技术性的问题是:
- 我花了几个小时才能完成作业?
- 什么是最具挑战性的部分?
- 为什么使用CodeceptJS?
- 我使用Ionic多久了?
- 我该怎么做才能改善我的应用程序和代码库?
我知道,无论是初中还是高年级,许多有才华的开发人员在寻找新工作并准备面试时都感到焦虑和缺乏能力。 虽然在面试前有些焦虑是完全正常的感觉,但是应该避免因恐惧而瘫痪。
我坚信设定正确的目标和实践正确的方法对于缓解您的恐惧并回答任何狡猾的面试问题而不会感到不适或焦虑至关重要 。
说到我,大约有5年的软件开发经验,我决定在每次可能的面试中都不再追求完美的目标 。 相反,我试图通过为自己设定目标并试图提高工作面试的质量来扭转局面。
结论
整个体验非常简单明了,没有浪费任何时间。 此外,在整个过程中也没有任何意外-一切都很清楚,完全符合我提交工作机会时收到的介绍性电子邮件中的描述。 并没有急于聘请候选人的经历,也没有对我施加任何压力的压力,而且一切工作都非常专业。
我希望我的文章能使您了解需要解决技术任务时如何组织工作流,以及总体上井井有条的开发人员招聘流程的外观。
由罗伯特·杰里克(Robert Jelic)撰写
翻译自: https://hackernoon.com/how-to-approach-a-technical-challenge-to-get-100percent-and-be-hired-xg2i32wj
外部董事聘任书