Erik is an ML researcher currently pursuing a PhD in machine learning at the University of Copenhagen (UCPH), 专门研究NLP主题, 知识图谱优化, 和NLP的可解释性. 他正在寻找机会将他的深度学习和软件工程技能应用到一个令人兴奋和具有挑战性的项目中.
人们常说,软件的好坏取决于它的文档, 这意味着开发人员需要能够有效地记录如何使用他们创建的内容. It’s one thing to understand how code works; it’s another thing entirely to be able to explain 它是如何工作的.
SQL 结构化查询语言(SQL)是最常用的用于创建和操作数据库的编程语言. 与R类似,它针对一个非常特定的用例进行了优化:管理关系数据库. 因为SQL本身是一种“不完整”的编程语言, 大多数精通它的开发人员也精通一种更开放的语言,如JavaScript, Java, or Python. That said, a SQL specialist can be a valuable asset for an enterprise organization operating at scale; there are situations in which performance optimizations measured in milliseconds can lead to millions of dollars in savings.
Databases —数据库是存储数据的存储库. 一般来说, 数据库分为两类:基于sql的(关系数据库)和NoSQL(非关系数据库). 这两种方法都有各自的利弊, 经验丰富的开发人员将能够确定哪个更适用于任何给定的用例. In general, 企业系统更有可能使用关系数据库来获得久经考验的稳定性, 而更多的现代科技初创公司可能会选择NoSQL来优化开发速度.
版本控制 版本控制描述了跟踪对软件代码所做更改的实践. 这是现代软件开发生命周期的关键组成部分, enabling developers to keep track of what changes have been made and by whom; to trace what consequences may have resulted from those changes; and to revert the codebase to an earlier version if serious problems arise. GitHub 和GitLab(都基于 Git)是最流行的版本控制平台之一, 但是一些较大的组织更喜欢维护他们自己的系统:例如, AWS 有自己的基于git的平台,叫做CodeCommit.
api是软件开发人员工作的面包和黄油:它们在所有编程语言中都无处不在, tech stacks, 和行业. 大多数开发人员都能告诉你api是应用程序用来相互通信的, 但这到底是什么意思呢? API调用包括三个步骤:首先, the client side of the app makes a request to the server; next, the server processes the request to ensure it’s valid and authorized; finally, 服务器将响应发送回客户端, 在哪里可以传达给用户. An example would be updating a user’s email address: First the user sends a request to update the email address in the database by submitting a form; then the server checks the request to make sure that the user has the appropriate permissions to change the email address; and finally the user interface displays a success message to let the user know that the request for the change in email address went through. 为非技术涉众设计的技术问题对于帮助评估开发人员知识的深度以及他们将知识转化为不分享其专业知识的同事的能力非常有用.
This line of questioning is intended to shed light on the developer’s problem-solving skills; asking about problems that stretch their existing skill set can also help you determine their level of experience. 这在与资历较浅的求职者交谈时尤其有用, 谁最容易被卡住. 回应应该包括阅读文档, 搜索谷歌和Stack Overflow, 梳理GitHub问题, 并向可能提供帮助的朋友和同事寻求帮助. 如果他们提到使用ChatGPT或其他生成人工智能工具, 询问他们如何审查反馈的准确性:众所周知,这些工具有时会“产生”无意义的代码或引入微妙的错误. 那些亲身经历过这种情况的人应该能够说出他们求助的可信来源.
你能告诉我一个你做过的与我们的项目相媲美的项目吗? 你面临的最大问题是什么?
你可以问的一个最直接的问题来判断候选人是否适合这个职位:“你以前做过类似的工作吗??” Of course, 在这里,“是”或“不是”的回答并不是很有用, 所以要追问他们的具体情况,了解他们的团队有多大, 他们的具体职责是什么, 以及他们参与重大项目决策的程度. 请他们描述一下他们使用了什么技术,以及为什么他们会做出这些选择. 在这个过程中,是否有什么伟大的想法或愿望不得不妥协或放弃? 一个强大的候选人应该对他们在接受你为他们安排的职位时可能遇到的问题有详细的了解.
在软件项目中处理多个任务时,如何设置优先级?
当时间是软件开发人员最大的限制因素时, 能够有效地划分优先级是至关重要的. 平衡用户的即时需求和涉众的长期愿景通常是相当复杂的. 你如何确保以稳定的节奏交付高质量的输出? 这些都是开发人员应该了解如何驾驭的关键项目管理技能. Developers from larger enterprises may discuss their experiences with Agile or Scrum methodologies; agency developers and freelancers will have more to say about keeping clients and managers happy with the timeline and scope of the project; and startup developers should be able to discuss priorities for launching a minimum viable product (MVP) and responding to the most-urgent bug reports from early adopters.
大多数开发人员面临的两个典型挑战是 FizzBuzz and the Fibonacci sequence. 在第一个, 开发人员被要求编写一个函数,根据整数的可整除性对整数列表进行排序(在这种情况下,应用程序应该在屏幕上打印“Fizz”)。, 5(应该打印“Buzz”), or 3 and 5(“FizzBuzz”). 在第二种情况下,他们被要求编写一个返回any的函数 nth 斐波那契数列中的数字,其中后面的每一个数字都是前两个数字的和. 这两种情况, there are brute-force solutions as well as more elegant and optimized solutions; the choices the developer makes along the way will help you determine how well they understand best practices in addition to data structures and algorithms. 专业的软件开发人员应该能够轻松地解决这类问题. 这些是早期职业开发人员最常见的挑战, 但请记住,最好的技术评估是那些反映实际日常工作的评估.