图像算法 技能
算法是每次面试中的常见问题。 它们变得如此普遍,以至于没有人考虑问他们的原因。 每个开发人员都必须知道如何解决随机的HackerRank任务。 许多公司认为这是默认要求,候选人也是如此。 但是您确定这是维护项目和按时完成任务的必备技能吗? 我会说,对于这些目标来说,这是最无用的。
TL; DR —我不知道如何解决算法任务,我不想拥有这种技能,并且我相信移动开发人员应该忽略需要它的职位空缺。
在过去的一年中,我进行了二十次面试。 并非所有人都成功。 面试失败的典型例子:
一家公司的面试分为四个步骤:语言,平台,体系结构模式和算法的知识。 我只失败了最后一个,它解决了HackerRank中的Easy / Medium级别的两个算法问题。
在另一家公司中,关于iOS SDK的具体问题很少。 所谓“ 特定 ”,是指: “在我的职业生涯中,我已经成功解决了所有任务,甚至都不知道这个问题,更不用说回答了” 。 最令人难忘的问题之一是: “ Git diff算法如何工作?”
移动开发人员任务
IMO 99%是布局,对服务器的简单REST请求,解析JSON并将其刷新到UI。 当然,我听说过增强现实,区块链和机器学习,这需要特定的数学技能。 我将摘要保留1%。 但是我经历了200个空缺,只有一次看到AR。 根本没有区块链或ML。 使用这些技术,是的。 但是请不要误会,它们远非普遍存在。 移动开发人员的典型任务如下:
- 阅读并理解很多旧代码
- 提交对它的更改,而不会增加对同事的理解,也不会产生新的错误
- 向服务器请求,解析,输出到UI,更改字体,颜色,角半径
大部分时间去哪里?
“读取别人的代码需要花费程序员80%的时间” –这个想法很明显,并不是我发明的。 有关“如何使代码整洁?” 的书籍 ,文章和讨论的数量。 证明这真的很重要。
您花费了大部分时间来理解某人的代码,因此任何优化都应该从该位置开始。 这是整个开发过程的瓶颈,因此其他地方的改进并不那么重要。
如何减少了解前任所写代码的时间? 必须使每个人都清楚地编写代码。 “透明”一词的含义由IT专家及其对最佳实践的无休止的讨论所定义。 静态代码分析器是很久以前发明的,不断为它们添加新的语法检查规则。 每个著名的公司都有公共风格指南。 现代语言(Swift,Kotlin)允许开箱即用的可选内容,函数式编程元素和其他允许更简洁地编写代码的东西。
令人惊讶的是,我每天都遇到狗屎代码……但是它的创建者完全知道如何平衡二叉树。 有多少个面试官问我关于样式指导或对短绒的经验? 他妈的零。
建立一个抽象
有人说:“但是移动开发中也有复杂的事情! 通过网络发送数据,处理划动手势或将数据保存到设备内存非常困难。 仅应由具有高级算法思想的人员来完成。”
这种观点与实际情况相反。 我不仅知道移动开发的历史。 通过创建高级抽象,存在明显的简化发展趋势。 程序员发现使用抽象来完成常见任务很方便。
曾经有一段时间,我们认为for(int i = 0; i 是世界上最舒适的模式。 现在,Swift中甚至根本没有++
运算符。 不建议使用此选项,以防止人们使用.map
, .sort
和.reduce
犯愚蠢的一次性错误。
专门人员正在为您的项目开发工具。 创建语言,框架和服务。 这些工具已由开发人员和用户进行了全面测试。 考虑一下。 停一分钟,看看你的生活。 不必成为程序员就可以意识到基于他人的成就去做某事的想法是好的。
如果您仍然不相信我:
- Spring Boot —在其他抽象之上的抽象。 该项目的含义-使配置和使用尽可能简单
- C ++ 17 —您仍然确定每个开发人员都必须知道lock和recursive_lock之间的区别吗? 结帐并关闭
- Javascript-我什至不 我想谈谈具体的事情。 只是整个JS。 JS + html-> React; 回调->许诺->异步/等待; CSS->弹性框
一切都证明了这一趋势。 OOP的发明。 C->С++。 飞机自动驾驶仪。 输送带。 麦当劳。 汽车共享。
少做多做
人们真的希望能够做更多的事情,而付出的努力更少。 您可以培训超级专家,他们将完美地执行您的复杂任务,并以汇编语言正确实现。 您可以训练飞行员对任何事件都有即时的React。 但是,这将花费更多的时间和金钱,并且不会带来任何收益。
显然,您甚至无法在生活必需的所有领域都达到可接受的水平。 因此,唯一正确的方法是成为其中一个专家,并将您的技能转化为他人的服务。 这些不仅仅是我的愚蠢假设,这就是进化。 重用别人的工作。 外包。 分担责任。 它更快。 这个比较好。 这就是世界的运作方式。
人们的认知偏见在于通常不愿承认一个简单的事实:程序员不应过度挖掘其工具的深度。 他必须信任他们。
如果在贵公司编写的私有库中发现了安全漏洞,则仅由您自己负责。 没有人会帮助您,因为您承担了所有责任。 从重要项目中带走人员,送他们进行维修,造成损失。 如果在Alamofire中检测到安全错误,那么,iOS社区的很大一部分将尝试同时修复它,因为这是一个共同的问题。
Alamofire代码是公开的,这意味着每个人都可以发现其中的错误,批评架构并提出问题。 因此,存在永久性的补丁程序,修复程序和改进。 但是,使用您自己的私有库,只有在用户数据泄漏后才能检测到错误。
他们对我说: “我们不会在Github上对10,000个星星使用这种依赖关系; 我们不信任它,也不知道它是如何工作的 。” 相反,我听到: “我认为自己比10,000名开发人员更聪明。 我将自己动手,不需要任何帮助 。” 人们知道算法,并确保他们是编程之神,他们将使一切变得更好。 这会阻止合理地使用时间,增加公司的风险,并增加自以为自己是程序设计之神的开发人员的成本。
泄漏抽象
普遍的看法是: “ 如果不深入了解工具的工作原理,就无法认为自己是专家。 如果出现问题,您将无法找出原因。 您取决于工具的制造商。”
当您用著名公司的锤子敲打手指时,您只有两种选择:
- 您开始研究锤子的材料,研究合金,化学成分。 然后,您购买了一本有关傻瓜的小型量子物理学教科书,并了解到原子不是最小的粒子。 您现在对锤子的工作方式了解很多。 但是您的手指仍然很痛,并且指甲没有堵塞。
- 您意识到自己是个蠢货,问题出在你身上,第二次尝试小心地锤钉子。
好吧,忘记隐喻吧。 工具可能会崩溃的情况。 但是,即使不知道锤子是如何工作的,您也会明白其中的原因。 如果您能够阅读和理解代码,则可以定位错误的位置。 如果您的工具使用情况接近错误,则可以联系制造商
您是否应该自己研究并纠正错误? 我认为没有。 汽车发生故障时,您将前往服务中心。 当您的健康状况恶化时,您去看医生。 UIKit损坏时 ,您将提交雷达 。 这是本世纪的优势-您可以随时获得专业人士的帮助。
但是,如果您仍然真正想要-深入研究。 但只有在必要发生之后! 在那一刻之前,只需更频繁地运行pod update
,就什么都不要考虑。 没有完全控制的感觉很可怕,但是您已经习惯了。 您每天信任某人一百次。 电话制造商,出租车司机,饭店厨师,公共事业。
问题是什么
了解所有工具的深入结构的要求适得其反。 我会说回归的。 厨师可能是专业人士,对刀的冶炼技术一无所知。 赛车手可以是专业人士,不知道汽油来自何处。 没有任何先决条件,这是没有必要的。 专业人士是知道如何使用其工具来产生高质量输出的人。 无论是美味佳肴,还是赛道上的最佳时机或五星级移动应用程序。
问题是解决算法问题的能力不会帮助您快速理解代码或以干净的方式编写代码。 而且,有一种观点认为,用于解决算法问题的代码是世界上可读性最低的代码。
这些公司要求我有适得其反的心态。 与进步,进化和理性相矛盾的思维定势。 同时,那些可以真正提高我的工作质量和速度的技能(使用第三方工具和短毛绒)被忽略甚至被否定了。
一分钟的理性
我知道编程之神确实存在。 它们创造了每个人都毫无疑问使用的惊人东西。 这些事情确实很复杂,而不仅仅是用新的颜色或view.layer.cornerRadius = 4
绘制按钮。 但是这些人是独一无二的,只占开发人员总数的十分之一。 并且请不要将其他开发人员与他们进行比较。
企业很少需要创造革命性的东西。 它几乎总是希望“像在那些项目中一样”并且“稳定且可扩展” 。 商业对您对NSURLSessionTask
的新包装不感兴趣。 如果要开发工具,则可以在此领域中工作。 例如,阅读复杂的书,获得所有必要的技能,然后去Swift Core团队。 但是,对于电子商务应用程序,它不需要算法技巧。 我们不会把他妈的特斯拉送上太空,好吗?
令人信服的是,成为一名程序员意味着成为一名发明家,创造者和建筑师。 每天花费最深的抽象事物和概念。 但这仅仅是……这是自欺欺人。 业界需要能够以所需的质量和速度执行单调工作的代码猴子。 这是一个很大的问题:行业是否需要您的创造潜能。 也许您只是希望它是真的?
能力考试
我有一个问题:“ 每个iOS开发人员真的需要了解算法吗? ”。 一个男人用丘吉尔的话回答我:
“事实上,民主是政府最糟糕的形式,除了不时尝试的所有其他形式……”
意味着这比检查开发人员知识水平的任何其他方式都要好。
我完全不同意这一点。 普通开发人员在“您知道哪种排序数组的方式”问题上的最佳答案应该是: “只需调用 .sort
并通过比较闭包” 。 而且没有快速或冒泡排序。
同样成功的我们可以将解决积分的能力称为“能力”的主要标准。 或者,例如,具有制作自己的主板的能力。 好吧,这也与逻辑和计算机有关。 沃兹尼亚克知道该怎么做,为什么不呢?
面试官必须检查员工是否符合业务实际需求。 如果企业需要我快速修复错误并清楚地实现新功能,请给我一个测试任务,以查找并修复错误。 给我一个任务,以重构一个类并使其他开发人员可读。
著名和富裕的公司可以承受任何不合逻辑的事情。 要求应聘者为dovahkiin。 但是问题是,其他不是很聪明的人看着这些星星,并且相信一切。 “ 他们是否只聘请哈佛大学毕业生担任scrubwoman工作? 现在就添加此要求” 。 这就是创建和维护他妈的牛仔工程师的崇拜方式。 这就是为什么我们有一些开发人员鄙视他人决策的原因。 他们只是参加任何项目,并发明了天才的飞轮,没人知道。 两年后,企业想知道为什么从头开始重写项目比解决所有问题要容易得多。
认为天空是绿色的并不比试图说服所有人都还不错。
说实话。 至少给我打电话说iOS中需要的三种算法。 除了diff算法,该算法已被批准添加到Swift中。
他妈的算法。 认真地从Swiftlint / Rules.md学习规则。
如果您喜欢这个故事,请给它鼓掌(50),并分享以帮助其他人找到它! 随时在下面发表评论。 请跟随我阅读有关RxSwift的更多信息。
翻译自: https://hackernoon.com/does-business-care-about-algorithmic-skills-1ca7f42e2a03
图像算法 技能