Tag: 开发人员

Atlas,移动开发周期的统一方法:网络层

作为开发人员,我们通常花费大量时间来编写,重写和重构现有代码。 对于我们中的某些人来说,它代表了通过干净代码的乌托邦进行的漫长的迭代过程。 许多开发人员没有抓住软件工程的要点之一:避免通过推广可重用代码来重新发明轮子。 向没有直接参与开发的项目经理或其他团队解释此过程可能经常引起争论: 时间就是金钱,您知道吗? 另一方面,知识的增长是公司的关键部分 。 至于日常生活中的许多其他内容,则是在这两部分中间的某个时刻。 什么是地图集 当今的大多数软件都与后端服务器对话,下载一些数据,然后将其他数据发送回给用户。 虽然网络层只是一部分,但它在每个应用程序中都起着关键作用:因此自然而然地,它是我们开始使用Atlas进行标准化的第一个应用程序。 Atlas的目标是为IQUII上的每个新客户提供一个共同的基础(框架):它将包括从网络层到持久性支持,推送通知和许多其他部分的所有共同功能。 这样的项目背后的好处很多: 专注于真正重要的事情 :有了共同的成长基础,我们可以将重点放在项目的核心:UX,UI和功能。 稳定性 :只需维护一个代码库,我们就可以着眼于更坚实和经过良好测试的代码。 标准化开发周期 :这只是整个过程的一部分,但是有了一套通用的规则,我们可以更快,更紧密地开发:从一个项目切换到另一个项目更简单,更省力。 我们将其称为Atlas,因为Titan谴责永恒的天空:我们的框架将在IQUII及其iOS和Android平台上容纳整个移动生态系统。 在本文中,我们将介绍Atlas的关键部分之一:网络层。 建立网络层的“不要”部分 如果您从未创建过单例课程来举行网络通话,请举手。 这是我在过去几年中遇到很多时间的常见情况,实际上,这是创建网络类的最简单方法:应用程序的每个网络调用都存在的单个单例类。 不要误会我的意思; 单身并不是邪恶,但是这种方法自愿打破了单身责任原则。 不管我们认为什么是出色的代码,它始终需要一种简单的质量: 代码必须是可维护的 。 任何无法维护且不能相对轻松地适应不断变化的需求的代码,都是在等待变得难以管理,然后过时的代码。 在任何编写不佳的代码中,您总是可以找到一个承担多个责任的类 我们的单身人士了解有关连接的所有信息( 基本url,每个请求的路径 ),如何构建和执行每个请求,如何解析响应数据,最后还管理内部用户会话和某些用户的配置文件数据(噩梦!)。 与网络连接相关的所有内容都位于这个庞大的单例类中。 如果您需要进行依赖注入,这也很成问题,此外,出于测试目的,也不能轻易对其进行嘲笑。 正确的方式 Atlas的目标之一是充当我们称为Athena的后端服务的通用客户端框架。 Athena是使用NodeJS / MongoDB创建的现代后端应用程序,它公开了REST JSON服务。 像Atlas一样,Athena代表了IQUII上每个新项目的共同点:它提供了一组通用的结构和方法,可以针对特定项目进行扩展。 从这个角度来看,我们在网络层要实现的功能最少: 用户持久性 :允许主机应用轻松登录/注销到系统中,同时保持会话活动(以及用户配置文件和设置)。 会话管理必须对主机应用程序透明,而配置文件和设置应由框架本身自动更新。 网络操作的抽象层 :提供一个可扩展的点来扩展网络功能:从编写新的端点来管理超时,处理网络错误,连接不良以及将对象转换为请求(反之亦然)Atlas提供了一种标准且健壮的方法与后端通信。 Handle Server Autentication :在Athena中,凭据由JWT的访问/刷新令牌管理。 基本上,这意味着用户登录后,您的应用会收到两个令牌:访问令牌是一个短暂的代码,必须在每次后续调用中都发送给后端; 刷新令牌是安全保存在应用程序沙箱中的长期令牌,仅用于在新访问令牌请求过期后对其进行身份验证(如果您对此官方OAuth指南感兴趣,请说明此握手的详细信息)。 […]

简单的Xcode hack可以帮助优化开发人员的生产力。

上述代码摘自我的一个iOS项目,名为“ OptimusPrime”; 这是一个质数计算器,我用作演示项目,用于演讲,研讨会和疯狂测试。 借助我的颜色编码,我一眼就能分辨出以下几点: 系统保留关键字(粉红色) :系统保留关键字不能以任何方式被覆盖,并且如果我们尝试这样做,编译将会失败。 我可能不知道Xcode中的每个系统保留关键字,因此最欢迎使用一种轻松区分它们的方法! Apple拥有的属性,类和函数(青色) 与用户定义的属性,类和函数(柠檬绿) :Apple拥有的和用户定义的对象,属性或函数以完全相同的方式工作,但是由其代码引起的错误是以完全不同的方式解决问题-尤其是因为我们可以修改实现而不是Apple的实现。 因此,有助于在两者之间进行一些定义。 硬编码的数字(紫色)和字符串(红色) :包括我在内的大多数开发人员都同意不惜一切代价避免使用硬编码。 通过为它们提供专用的颜色集,我们也许能够更轻松地发现它们,从而更快地用常量替换它们。 注释(灰色) :注释是代码的说明(或IDE屏幕文档的一部分),但不是编译或处理的实际代码的一部分。 因此,应将它们相应地着色为文件的不必要部分。 属性和框架声明,函数中的属性访问器(白色):当更多关注时,我还可以看到函数调用比属性调用更明亮。 在我的特定情况下,我什至不需要花时间自定义调色板,因为IDE中的默认调色板之一可以满足我的需求和个人喜好。 但是,在以前的Xcode和macOS版本中,我确实必须使用“ Midnight”调板作为基础对其进行自定义: 在自定义方面,由于我的视力无法应付由默认对比度和大屏幕上的小字体引起的疲劳,因此我将柔化各种颜色的对比度并增加字体大小。 对我来说幸运的是,最新的Xcode版本中提供的新的Default(深色)调色板非常合适! 其他视觉元素 在最初的屏幕截图中,您可能已经注意到了其他一些视觉元素。 这些元素虽然与颜色自定义无关,但为我提供了一些我认为在编码时有用的附加信息。 让我们回顾一下! “当前正在编辑”行标记。 源代码编辑器中的当前行被突出显示,从而提供了一种轻松的方式来知道键入时我正在编辑的行。 这也很好地表明了您是否已滚动到编辑范围之外。 行号。 左边距中当前文件行号的存在有多种用途。 首先,在We Are Mobile First上,我们不喜欢大型源文件。 它们很难调试和维护。 正如我们有关健康编码实践的文章中所讨论的那样,我们使用单一责任原则。 如果文件太大,通常意味着我们可以将代码拆分为较小的任务。 通常,我尝试将文件保存在少于150行的代码内(不包括注释)。 其次,调试时查看行号很有用,因为编译器或调试器可能会引用触发错误的代码行。 最后,当使用版本控制工具时,在合并或同行审阅代码时查看行号会很有帮助。 关于版本控制工具的更新。 有些人可能已经注意到某些行中行号旁边的蓝色标记。 这些标记突出显示了相对于我们的版本控制工具中的最后一次提交已更改的代码行。 右垂直边距。 我们在几个项目上使用短绒棉。 我们使用的最常见规则之一是“一行中最多XXX个字符”。 在这种情况下,“ XXX”通常为120。我厌倦了触发编译器警告或错误,因此我将Xcode设置为在一行中的第120个字符处自动添加此垂直边距,因此可以直观地看到该限制。 折叠标记。 行号旁边的代码文件夹使我可以轻松折叠/展开代码段。 结论 在大多数当前的IDE中,具有视觉吸引力的设置很容易实现,但是我还没有看到很多开发人员可以自定义自己的设置。 这似乎很轻浮,但只需要花费五分钟的时间,从而可以帮助您提高视力并改善性能。 […]

这是马克·盖奇

‘请你介绍你自己?’ 我最难回答的问题之一就是不打勾简历上的要点,或者变得冗长而又不触及重要细节,至少这是我对此问题的看法。 所以在这里,我努力传达我的身份。 我是一名iOS开发人员和软件工程师,在构建iOS应用程序方面拥有大约4-5年的经验,并且在过去7-8年中进行了总体编程,包括基于Android和基于Web的项目。 但这只是我的一部分。 我还是一位企业家(与他人共同创建了一个葡萄酒旅游应用程序),还是一位数字艺术家(业余爱好者),他也喜欢在UI上工作,最重要的是,我是一个希望看到世界的旅行者。 不仅是工程师,而且还有更多…… 领导: 尽管编码是我每天要做的事情,但领导是我所做工作的另一个组成部分。 领导开发工作,制定标准和代码审查。 指导和指导其他开发人员。 产品管理: 有机会在初创公司和中小型公司工作,我有机会在产品开发方面提供帮助,创建用户案例,评估开发工作,UI / UX工作流程。 产品领域: 成为一个不回避挑战却勇往直前的人就是我。 始终学习并推动自己致力于葡萄酒行业的各种不同领域,以进行照片编辑,基于社区的共享内容以及VR。 我从来没有说过我不能做某事,而是说我不知道​​该怎么做……但是我会学习的。 基本上,我是产品制造商,我喜欢将创意转化为现实。 因此,让我们看一下我从事过的一些应用程序: 提克特(Tickld),《大笑之旅》 基于社区的应用程序,由用户生成的内容组成; 图片,GIF,故事和视频,在…之间共享 medium.com GrapeTrail,探访加拿大酒庄 我与他人共同创立了一家SaaS初创公司,并运营了大约2至3年,领导着一个由2个人组成的团队,一个Web… medium.com 众所周知,内容如此丰富,您可以分享 消费,评论和分享有趣的基于事实和真实故事的应用程序,由我们的团队策划和创建。 medium.com 现在,您可以快速了解我的身份,也可以通过我的投资组合出版物找到更多我从事的项目。 让我知道您如何回答“告诉我您自己”的问题。 让我们连接! 通过评论我的帖子或与我联系,不要犹豫, 电子邮件: markgage86@gmail.com 推特: markgage86 盘带: markgage86

GrapeTrail,探访加拿大酒庄

我与他人共同创立了SaaS初创公司,并运行了大约2-3年,领导了一个由2人组成的团队的开发工作;一个由Web开发人员负责酿酒厂的后端和自定义CMS,而我则负责构建iOS应用程序。 该工具不仅可以了解安大略省的酿酒厂和葡萄酒,还可以创建自己的葡萄酒之旅。 语言: Objective-C 功能:用于依次导航的Google Maps SDK,发现酒庄(连接到我们的API和自定义CMS),行程。 通过使用针对酿酒厂的自定义CMS查找和发现整个安大略省的酿酒厂,他们可以在其中输入信息(应用可以通过我们的API访问)(位置,时间表,葡萄酒,照片) 添加您感兴趣的酒庄,并与附近的酒庄一起创建行程。 借助Google Maps SDK,继续冒险之旅,通过转弯导航到目的地获得直观的转弯。 借助Core Location,该应用程序能够识别您何时离开酿酒厂,并开始导航至行程中的下一个位置。 我的第一家初创公司虽然未能产生真正的金钱和吸引力,但却是一次很棒的经历,学会了协调Web,API和App两端的开发工作。 与酒厂一起工作并了解他们的问题。 您是否有自己的创业公司? 您正在处理哪些挑战? 您决定不使用的功能? 或者,如果没有,为什么不呢? 让我们连接! 通过评论我的帖子或与我联系,不要犹豫, 电子邮件: markgage86@gmail.com 推特: markgage86 盘带: markgage86

众所周知,内容如此丰富,您可以分享

消费,评论和分享有趣的基于事实和真实故事的应用程序,由我们的团队策划和创建。 语言: Objective-C 功能:推送通知,Facebook SDK,离线保存 作为业务中比较流行的一面,只有开发了相应的移动应用程序才有意义,该应用程序具有一些您无法在网络上获得的功能。 从一开始就构建了此应用程序(构想,线框图,功能列表),然后在应用程序商店中发布。 建立推送通知,用于发布新内容或您最喜欢的作者发布内容的时间,以及其他用户回复您的评论的时间。 除了构建“脱机保存”功能外,还可以保存内容以供以后使用,尤其是在您没有网络连接(通过地铁上下班)的情况下,这些内容是通过iOS端的Core Data构建的。 您是否曾经构建过移动版本的Web应用程序? 您添加了哪些功能?(如果您添加了)以区别或添加到移动版本? 让我们连接! 通过评论我的帖子或与我联系,不要犹豫, 电子邮件: markgage86@gmail.com 推特: markgage86 盘带: markgage86

WWDC17 —回顾展

我们的两名开发人员Tim和Niall参加了抽奖活动,并获得了今年WWDC,苹果全球开发人员大会的门票。 Michael是他们不幸的iOS同事之一,就他们的WWDC经验以及iOS 11和Xcode的新功能采访了他们。 另一个不太幸运的同事杰西卡(Jessica)也加入了。 Niall,这是您的第一个WWDC,那么为什么不从给我们您对WWDC的总体印象开始呢? Niall(ND):很容易陷入炒作之中,我认为它会逐渐消失,但是这个地方的能量和对它感到非常兴奋的人的种类使你继续前进。 我非常喜欢它,整个活动,演讲者和场地。 今年是在圣何塞,是您第一次来圣何塞吗? ND:是的,我感到有点遗憾,因为它不在旧金山,因为我认为这是一个比圣何塞更有趣的地方,但是无论如何,您实际上并没有在场地外获得大量的时间-差不多全开。 蒂姆,这也是您去年第二次参加WWDC,请问该如何比较? 蒂姆(TC):我更喜欢圣何塞的场地。 一切都在一个楼层上,虽然紧凑但很大。 迈克尔(MB):那没有道理…… ND:感觉就像所有的东西都紧靠在一起,您真的不需要走太远就可以到达某个地方,但是无论何时到达任何地方,都有大量的空间-大厅很大。 “……您觉得很久以前就应该在那里的东西终于来了。” 就开发人员工具而言,最大的收获是什么? ND:我认为对我来说最大的改变是Xcode 9的一些更改,特别是新的重构工具,以及引入的一些生活质量更改,您认为应该有很长的时间时间前终于来了。 运行多个模拟器,进行无线调试对于Apple TV的开发将特别方便,并且还有其他一些优势,例如大大改进了代码折叠功能。 TC: iPad的新iOS 11功能给我留下了深刻的印象。 现在基本上在计算机上已经完整。 应用之间的拖放,改进了分屏显示。 MB:您认为这会让您想编写更多iPad应用程序吗? TC:是的,我真的很想尝试这种拖放式的东西,它在iPhone上的应用程序之间不起作用。 在第一个Beta中,我已经能够使其在测试应用程序中运行,但是他们在第二个Beta中禁用了它。 “我认为对于那些不住在命令行中的人来说,他们可能不需要太久的其他git工具,例如Tower或SourceTree。” 我和杰西卡都没参加会议,但是我们在家里一起玩,所以对您来说,杰西卡对您来说最大的好处是什么? 杰西卡(JC):我也非常喜欢重构方面的改进,这是我到目前为止一直在使用的主要内容。 显然Xcode更好,但是我在Android Studio中做了一些基本的事情,而这些东西在Xcode中是做不到的,对于Swift,您甚至不能做基本的重命名。 这是很简单的东西,但是却有很大的不同。 MB:到目前为止,我最喜欢的是Xcode 9中的新git功能。能够轻松浏览所有分支和标签,查看所有提交以及在完整的并排编辑器中查看差异是一个很大的事情。改善。 我认为对于不在命令行中的人们来说,他们可能不需要太久的其他git工具(如Tower或SourceTree)了。 TC:尽管如此,我认为它过于关注GitHub了-如果它更通用,那就更好了。 MB:是的,虽然我提到的东西可以在我们所有的git仓库中使用,但是我们在大多数项目中都没有使用Github,但是当然还有很多其他功能仅适用于GitHub,我想知道他们是否会为BitBucket添加类似的东西在未来的几年。 JC:所以您一直在使用Xcode中的git? MB:是的,实际上它是最棒的功能,我认为是后台获取,并突出显示远程文件更改的位置。 不必考虑这一点,只需在文件旁边看到一个小图标就可以了。 您认为Xcode或其他开发工具中还有什么值得一提的吗? ND:在大型项目中,Xcode 9的速度要快得多,搜索的速度要快得多。 TC:编辑器中的滚动确实得到了改善,滚动更大的文件的速度更快。 MB:还有一件事,我没有看到,但是您提到了Tim,我觉得听起来很棒,它是快照调试状态,您能告诉我们一些吗? TC:有时候您会发现一个错误,但是您不是一个要修复的错误,因此您可以暂停执行,拍摄快照并将其发送给另一位开发人员。 他们可以导入并运行它,然后从该状态继续。 不幸的是,这仅适用于SceneKit调试,但是仍然很酷。 我去过的每个WWDC,最大的欢呼之一就是他们一劳永逸地解决了我们所有的代码签名麻烦,而您提到他们今年再次做到了Niall? ND:是的,他们已经取消了从Xcode吊销发行证书的功能,因此希望这将减少意外吊销。 他们还更改了代码首选项中的“帐户”标签。 如果您在那里管理证书,它将为您提供各种证书的状态,并指出特定问题,例如证书是否在钥匙串中或是否已被吊销等。 MB:这次没有“修复问题”按钮了吗? […]

Hotels.com在dotSwift 2019会议上

1月的最后一周,Hotels.com iOS团队的两名工程师前往巴黎参加了第五届年度dotSwift会议。 对于那些不知道点会议是什么的人,让我让您快速上手。 点会议相当于TED演讲,但更侧重于技术行业的主题; dotConferences有7种不同的风格:dotSecurity,dotScale,dotAI,dotGo,dotCSS,dotJS和我们自己的dotSwift会议。 那天是与行业内其他工程师会面以及与Expedia Group内其他工程师(即来自巴黎Traveldoo的iOS团队的成员)会面的好日子。 一天被分成3组,每组之间都有休息。 讨论的话题范围很广, “纯粹的快速”应用程序并不是真正的东西,因为它们都依赖于Objective-C运行时以及采用Objective-C的方式(而不是试图尽快摆脱对它的提及)尽可能荒谬),例如关于为什么在代码中为方法和变量名使用Unicode字符的建议。 我觉得我应该对此做一点解释: 谈话远没有暗示您要做这样的事情; ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⛵️⎈ 告诉您的船上物体应该向左转。 该表示法可能会作为当代艺术作品消失,但作为命名约定的标准绝对没有用。 相反,它专注于科学建模并使用方程式具有的相同符号,例如分别将∑ (sigma)用作函数,将λ (lambda)用作波长分别作为函数和变量名称。 如果您要与不想看长函数名的物理学家合作(不管它们的描述性如何),这是有道理的,并且还给他们提供了调试算法(而不是代码)的机会。 听到一些非常有才华的人的想法真是太好了–我们甚至还听到了苹果公司开源项目工作人员的演讲,例如SwiftNIO(异步事件驱动的网络框架),它使人们真正了解了他们所面临的问题遇到以及他们如何解决它。 除了主要演讲外,Swift社区成员还进行了许多闪电演讲。 这些都是直截了当的超级快速对话,经常提供思想观点或提出解决问题或技巧的有用方法。 演讲的照片可在https://dotswift.io上获得。 可以观看视频:https://www.dotconferences.com/conference/dotswift 我强烈建议您给他们看表-也许您会找到解决您当前遇到的问题的方法或学习新知识。

从iOS开发人员到产品经理(第1部分)

产品经理(PM),听起来不错的职位,对吗? 但是我是如何从开发人员成长为PM的呢? 我期待什么,我得到了什么? 你怎么能成为一个好的下午? 我的故事始于一名iOS开发人员,我自己学习了一切,没有人教过我,仅仅是因为没有人能做到(目前,突尼斯大学没有教过)。 在2010年,我是一名刚开始对3D游戏充满热情的计算机工程师。 我当时正在这个领域寻找工作,但是那个时候在突尼斯,只有少数几家公司指定3D领域,没有人愿意雇用没有经验的人,我们都知道……而我需要一些钱(例如,您知道要吃饭),我在一家法国电信公司的呼叫中心成为了代理商agent。 “ 可是等等! 你为什么要谈论这个? 这与PM工作无关。 “ 是的,它确实 ;)。 实际上,这对我的运营商非常有用。 它使我学会了如何控制自己的压力(如果有客户打来电话,很少会向我们表示祝贺。)以及“引导”讨论和他对我所工作的公司的“愿景”。 这是一门艺术,我对此很擅长。 但是您知道工程师永远无法或至少不会这样做。

提克特(Tickld),《大笑之旅》

基于社区的应用程序,由用户生成的内容组成; 图像,GIF,故事和视频,它们之间以及与社交媒体之间共享。 还具有典型的社交网络应用程序的功能,用户配置文件,关注者/关注者,查看/创建/发布内容,评级和评论,并使用托管在AWS S3实例上的后端构建。 语言: Objective-C 功能:推送通知,Facebook SDK,新的Relic Analytics SDK,简单的照片编辑器(裁剪,添加文本和图像叠加层) 创建了一个新设计,帮助了消费内容的流程和UI元素的更好位置,从而增加了评论和投票的使用率。 构建推送通知和自定义的简单照片编辑器,完成简单的模因创建,裁剪图像,添加图像和文本覆盖图。 我的第一个产品应用程序之一,不仅是我要构建并签署给客户,而且有机会在此过程中使用多个版本,就痛点和问题与社区进行交流,并基于分析数据。 如果您有一个必须更新或使用旧代码的应用程序,那将如何呢? 在下面的评论中让我知道。 让我们连接! 通过评论我的帖子或与我联系,不要犹豫, 电子邮件: markgage86@gmail.com 推特: markgage86 盘带: markgage86

Xcode扩展

在今年的WWDC期间,Apple宣布了Xcode Source Editor Extensions,这是一种扩展我们最喜欢的工具的功能的简便新方法。 如果您对如何利用其功能提高生产力感到好奇,请继续阅读。 软件开发行业中许多聪明的人都认为我们的职业是一种手工艺。 这种隐喻的一个方面尤其是真实的-工具。 伟大的工匠需要伟大的工具,但是随着谚语的流逝, “一个坏工人总是责备他的工具” 。 Christoph Gockel提醒我们,我们应该“为工作选择合适的工具”,如果没有,我们应该创建自己的工具,这正是我们要做的。 Xcode曾经有大量的第三方插件。 “习惯于”,因为Xcode 8将不再支持它们。 这是一个非常令人遗憾的消息,但是这样做的理由特别充分(与安全性和可靠性有关)。 苹果还知道工程师不喜欢抽空并阻止我们做一些不负责任的事情,例如剥离IDE的代码签名,他们为我们提供了一种构建自己的自定义工具的新方法。 WWWC演讲很好地描述了新的可能性,但是在App’n’roll,我们知道最好的学习方法是弄脏双手。 JSON模型 你们中的许多人可能在应用程序中使用了网络,因此您有时会不得不解析JSON并为其编写模型。 IDE可以为我们完成这项任务,因此我们决定为其编写扩展。 为了简单起见,我们必须做一些假设。 首先,我们希望当前编辑的文件的内容必须为JSON。 其次,我们将忽略与嵌套对象有关的边缘情况。 重要说明:我们的示例是使用Xcode 8.0 beta 2创建的,因此它可能无法始终按预期运行。 如果您仍在使用El Capitan,则必须遵循Xcode 8.0 Beta发行说明中的​​说明-Xcode 8.0 beta中的已知问题-IDE,源代码编辑器扩展。 另外,请记住在运行扩展程序时要耐心等待。 如果您打开项目的速度太快(在扩展加载之前),则无法从测试Xcode实例的菜单中使用它。 让我们首先创建一个新的macOS项目(确保选中“单元测试”框),然后将新目标添加到默认应用程序中-Xcode Source Editor Extension : 这将为我们和两个新类创建一个Info.plist 。 在深入研究代码之前,我们先来看一下Plist 。 要更改Xcode菜单中显示的名称,您必须编辑Bundle Name和XCSourceEditorCommandName。 首先为我们生成的类会向XCSourceEditorExtension进行确认,并会在加载扩展时通知我们。 我们不会在项目中对其进行修改。 第二类向XCSourceEditorCommand确认-一种仅具有一个方法的协议- 执行(使用invocation: , complementHandler :)将在我们调用命令时执行。 该扩展名将为我们提供当前文件的内容以及修改它的方法。 […]