GoJek训练营03 —地狱的经验!

我在Go-Jek进行了2017年夏季实习生,从那以后,bootcamp的奥秘一直让我着迷。 我对获得全职工作感到非常兴奋的一件事就是Bootcamp。 Go-Jek的每位新员工都必须经过严格的训练。 这一理念来自Thoughtworks和现任CTO。

训练营是对我的生活产生重大影响的事情之一。 我的思维方式,感知事物,做出判断,辩论,争论,行动等等。

训练营分为6个模块。


核心工程是训练营的第一个模块,由Sidu Ponnappa,Rajnish Dashora,Sahil Kharb和Iqbal Farabi担任。 我们将在Java的上午会议中做所有事情,并在红宝石中重复与家庭作业相同的任务。 该模块为期4周。 始终要遵循10条不可转让的礼节,违反这些礼节将导致rm -rf用于我们的任务。 这是程序员的10条诫命。

  1. 没有制表符,只有空格
    根据环境的不同,制表符的空格数量不同,但空格始终是一个
  2. 代码构造之间的缩进和间距
    类,方法,规范应保持一致。 缩进应基于该语言的公认惯例。 例如:对于Java是4,对于Ruby是2。
  3. EOF的新生产线
    Git希望在每个文件的末尾添加新行。 如果您不这样做,则会向您发出警告。
  4. 接受的语言命名约定
    对于ruby中的变量,使用snake_case;对于Java中的变量,使用camel;对于Java中的变量,请使用case
  5. 接受的语言文件/目录命名
    不同的语言有不同的约定。 在Java中,类文件名应以大写开头,而在ruby中应为snake_case
  6. 使用名称空间
  7. 无评论/未使用的代码
    为什么我们需要评论? 使代码使用规格说明自己。
  8. 运行时环境应与IDE一致
    我们应该能够从IDE和命令行运行规范和应用程序。
  9. 使用 .gitignore
  10. 一律做BDD
    每次提交一份规格

但是为什么要进行核心工程?

我们编写的代码是我们思考和设计方式的直接结果。 因此,要使一个人成为更好的程序员,就必须消除他们的困惑,以消除他们的困境。 通过让他们对自己的方法进行辩论,并让他们解释为什么他们的方法比其他方法更好。 通过与他们矛盾并让他们以多种其他方式解决问题,直到整个团队都相信一种方法。 核心工程学不是Java / Ruby的学习阵营。 它是根据如何解决问题以及在寻求解决方案时应注意的“做与不做”原则而设计的。 它本身就是您如何思考问题的旅程。

我们得到了简单的玩具问题。

  • 计算两点之间的距离
  • 用卢比和钱建模钱
  • 建模矩形
  • 做一个计算器

通过这些问题,我们了解了各种OOPS和编程概念。

BDD

我们从流行词开始-TDD和BDD。 它们是什么,为什么重要? 有哪些测试? 有什么规格? 什么是单元测试,它与BDD有何区别? 为什么以及何时应该使用BDD? 这些是我们感到有答案的问题,但这些问题彼此的区别在于清楚的来源 。 BDD是通过限制范围并为解决更大的问题而进行的小步骤来解决问题的方法。 我们为要达到的目的编写规范,并通过最低限度的代码。 由红色,绿色,重构,提交周期组成。

一些规则

3原则 :任何常见的事情如果发生三次,只需重构或自动化即可。 对于何时进行重构以及何时进行自动化,这是非常重要的原则。

关注工具:工具是程序员的第三好朋友(仅次于狗和书)。 我们致力于IntelIJ和RubyMine。 快捷键如shift + F6command + option + L等对提高我们的生产率有很大的影响。 另外,我们每天都有打字手将WPM指标提高到50以上。 最近,我开发了一种喜欢vim的工具,并且如果您知道如何使用它,则可以使用它的强大功能。

OOPS :Ruby和Java是学习OOPS的最佳语言之一。 基本问题,例如何时类有效( 状态和行为 ),getter / setter行为( ),何时使用getter和setter,何时使用接口,在比较到来时始终覆盖相等性,覆盖内置的toString和比较器,诸如“ 告诉勿问”DRY,SOLIDDelemeter律,SRP,KISS,YAGNI和最大的EXPRESS INTENT等原理

自述文件和洗衣清单我们制作的每个项目都应具有自述文件和洗衣清单。

校准 :我们以前每个星期一都要进行校准。 解决Convay的人生游戏。 并每10分钟提交一次。 每当我们的解决方案变得更好并遵循​​更多原则时,我们就这样做了4次。

永远不要爱你的代码 :为了使我们成为一个更好的程序员,我们不能在代码上附加字符串,并且总是必须开放以进行更改。 您只松开坚持的东西-佛陀。 我多次得到rm -rf

除此之外,我们还与Sidu进行了有关金钱,愿望,说您的意思,VLCC, Horse and Rider哲学等的各种哲学会议,它们的确很棒。


训练营的第二个模块是Devops,由Prashant Mittal和Debashish Ghatak接管。 持续时间为2周。 Devops不是团队或框架,而是一种哲学。 早期用于编写代码的人与用于部署代码的人有所不同,从而导致大量延迟和生产延迟。 对于编写代码的人来说,部署它比其他一些人更有意义。 这种哲学称为devops。

为什么我们需要发展?

我们的简介是产品工程师。 我们生产产品。 因此,作为产品工程师,我们应该了解我的产品的端到端。 我作为产品工程师的工作。 编写业务逻辑以将其部署到最终(到达最终用户并增加业务价值)。 而且,在快速变化的环境中,这样做会产生更多的逻辑。 假设一家公司由软件工程师编写代码并由他人部署。 在部署之前,其他人必须了解代码的内容。 可以说,任何错误都会出现,这两个团队之间的通信开销很大。 通常情况下,门票只是浮动在中间,从而大大降低了生产力和商业价值。

学问

我们从阅读和理解开始学习困难的Linux 。 我们从该模块中学到的最大知识是Google和手册页是程序员最好的朋友(甚至比狗和书还早!)。 我们了解了如何有效地进行Google搜索,以及当您遇到问题时如何使用Google / Duckduckgo。

使代码系统不可知

我们首先要做的是使代码不依赖于我们所使用的系统。 我们所有人都有我们在Core Engineering Bootcamp中进行的Java Life of Project项目。 所有这些都是在OSX上完成的。 现在我们想使代码系统不可知。 假设我的团队中有Windows用户,OSX用户和Linux用户,并且希望他们运行我的《生活游戏》代码。

一种方法是编写3个自述。 每个一个。 另一种方法是在团队中修复操作系统。 说Linux。 现在,如果我们可以使每个人都可以从具有已安装依赖关系的任何系统访问此文件,那么我们的工作就完成了。 那就是我们了解VM和Vagrant的地方。 Vagrant是可以帮助我们管理虚拟机的工具。 制作一个Vagrant文​​件,并在任何地方使用该文件来复制计算机。 因此,自述文件中现在唯一的指示是将Vagrant安装到他们的计算机中,然后将Vagrant安装起来 ,每个想要工作的人都必须启动VM。

持续集成(CI)

持续集成(CI)是一种开发实践,开发人员经常将代码集成到共享存储库中,最好一天进行几次。 然后可以通过自动构建和自动测试来验证每个集成。 集成中断时,系统会通知所有人在管道修复之前不要推动。

但是为什么要CI? 在简单系统中比在复杂系统中工作非常容易。 如果我们检查每个小更改的错误,则由于更改较少,因此可以很容易地识别它们。 易于调试,这是定期集成的主要优势。 我们可以快速发现错误并更轻松地定位它们。 由于引入的每个更改通常很小,因此可以快速查明引入缺陷的特定更改。

持续集成并不能消除错误,但确实可以使查找和删除错误变得更加容易。 —马丁·福勒(Martin Fowler)

在服务器上部署

现在,使用CI管道,首先测试任何推送的提交,然后将其打包在工件中(或者可能要经过更多阶段的管道,如棉绒等)。 我们首先手动编写Vagrant和Docker文件,以安装系统依赖项,然后获取打包的代码并进行部署。 但这不是自动化,如果要进行多次部署,我们将重复很多次。

进行所有这些操作的主要原因是使事情自动化。 程序员很懒,如果您第三次执行相同的过程,请使其自动化。

厨师入场! 一个根据您创建的食谱制作菜肴的框架。 基于基础架构作为代码原则 。 意味着安装ruby 2.5.1也是一个需要规范的说明(使用厨房)。 实现DRY。 我们创建了包含很多食谱的食谱。 食谱包括安装ruby,安装工件,安装捆绑程序,安装openssl,运行服务器等。它基于每个指令都是代码的原理。

我们的服务器已启动并正在运行。 但是,我们需要运行一个以上的应用程序实例。 在请求增加时分配负载。 我们创建另一个具有负载均衡器并平衡负载的盒子。 我们使用HAProxy和循环算法来分发请求。 另外,我们需要一些监视系统来在出现故障时重新启动服务器并向我们发出警报。

最后一部分是使用kubernetes部署相同的应用程序。 为什么选择Kubernetes-自动化! 几分钟之内,我们便可以准备一个带有所需食谱的新容器,并可以取下未使用的容器。 它是一个完整的软件包,可以智能地扩展您的系统。


这是一个为期3天的模块,我们在其中学习了代码库中的一些常见漏洞以及它们可能产生的影响。 没有100%安全的系统,但是我们必须尝试构建99.99%安全的系统。

我们给了一个带有漏洞的简单CRUD应用程序,我们不得不从相同的漏洞中删除这些漏洞并保护了该应用程序。

SQL注入

我们必须了解什么是sql注入及其发生方式。 准备好的语句如何提供帮助以及它们如何保护我们免受此漏洞的影响。

HTML编码

我们需要在处理html时对其进行编码。 否则,任何智能HTML输入都可能成为漏洞。

输出编码

与HTML编码类似,后端服务有责任提供良好的清理数据。

授权与身份验证

我已获得进入GoJek办公室的认证,但无权进入Nadiem办公室(我们的首席执行官)。

盐,MD5和Bcrypt

我们知道了为什么要使用盐,加密和哈希之间的区别是什么,以及现代密码的存储方式,因此即使密码被泄露,我们也不会遭受太大的损失。

IDOR(不安全的直接对象参考)

每个人都应该只能看到他们的意图。 我们不应该看到别人的数据。 妥善管理ID和会话。

更多的学习-

  • 除此之外,我们还了解了一些关于种族状况以及如何解决它们的知识。
  • 我们还知道了忘记更改清单中的某些默认值会如何危害android应用程序。
  • 我们了解了什么是GPG密钥,并使用它们来设置gitlab帐户。

这是1周的课程,是最忙碌的课程。 我们将准备Go-Movies应用程序,如下所示。

大多数人从未使用过android,但过渡到Kotlin并不那么困难。

基本

Android是主要针对触摸屏设备的基于linux的手机操作系统 。 最新的Android Api为28(截至2018年9月26日)。 Lollipop 5.0是API21。像GoJek这样的公司在API 16上约有1%的员工。1%的人大约有10000+。 因此,转移Api版本可能确实有问题。 对于相同的问题,我们有各种解决方法。

设计屏幕

我们了解了不同类型的布局-线性,相对,框架,表格。 何时使用哪种布局和视图。 我们学习了如何使用具有不同属性的XML设计这些布局。 我们学习了将字符串和尺寸保留在单独文件中的最佳实践 。 相当多的人得到rm -rf相同。 Android Studio功能非常强大,并且几乎可以使用IntelIJ的所有快捷方式。

格森

Gson是Google解析Json的库。 将Json字符串转换为系统的对象类型(Java / Kotlin)。 我们使用它来将json数据从tmdb api转换为kotlin对象

碎片

活动由片段组成。 碎片是基础。 他们就像轻量级的活动。 绘制与Web的并行性。 我们打开一个页面的网站,所有视图都在那里。 然后,我们使用JS根据某个事件显示一个事件并隐藏另一个事件。 将此与我们必须提交表单的页面进行比较。

回收者视图

正如循环的字面意思所说,我们正在重用已经制造的东西。 假设我们要放映100部电影。 我们也可以在列表视图中显示它们,但这不是一个好方法。 Recycler视图的优点是只能制作10张+4张电影卡,因为在屏幕上我们最多可以看到10张电影卡。当我们向下滚动时,顶部的电影卡会在底部显示,但数据会更改。 绑定适配器可处理此数据映射。 布局管理器会注意显示最大影片和滚动的数字。

储存资料

我们使用SharedPreferences来存储数据。 我们讨论了如何读取和写入共享首选项的数据。 数据实际如何存储在手机中,以及是否有可能读取其他应用程序的共享首选项。

调试

我们了解了如何在android中使用调试器,以及卡住时调试器的用处。 Android Studio具有相同的出色实现,并且使用起来相当容易和琐碎。


这是一个为期3天的模块,我们了解了分析数据的重要性和影响力。 目前,我们为300万以上的预订提供服务,并拥有大量的数据,我们可以根据这些数据做出重要的决策并做出出色的功能。 很少有应用程序包括:标记接送目的地,分析用户的品味并显示目标凭证,显示估计的到达时间,选择最佳驾驶员,路线价格,给予奖励,用户和驾驶员评分等。这些是数据的少数领域科学发现了其主要应用。

在石油和核能之后,今天的话题是数据-Peter Thiel

我们从ipython notebook的基础开始。 了解了基本的熊猫API,例如导入数据,排序,过滤,基本统计信息等。

然后,我们通过条形图,折线图,饼图和箱形图,直方图等实现了数据可视化。我们还了解了matplotlib库。

线性回归

它是对数据建模的一种方式。 我们有数据。 我们希望根据这些数据来预测一些事情。 线性回归是一种实现方法。 假设我们有基于房屋特征(房屋大小,车库,状况,年建,has_swimming_pool等)的房屋售价数据[数据集],我们想获取房屋的售价。 我们可以对其进行线性建模-如下所示。

 售价= Theta1 * [Feature1] + Theta2 * [Feature2] + Theta3 * [Feature3] +……+ ThetaM * [FeatureM] 

特征值是数值。 Theta是系数。 如果我们可以根据所拥有的数据调整theta的值,则只需插入新数据的要素值即可得到房屋的销售价格。 因此,我们的工作是现在调整这些参数。

梯度下降

它是找到功能最小值的算法。 我们必须从山上降到最低价。 我们沿着坡度最高的道路下来。 我们通过最小化线性回归的误差来使用梯度下降。 当我们最小化误差函数时,我们的线性回归系数(theta)将得到调整。

逻辑回归

Logistic回归用于使用S型函数和概率将线性回归转换为分类问题。

卡格勒

我们提交了针对Kaggle的“高级房价预测挑战”的第一个解决方案,并根据我们制作的模型获得了排名。


这是1周的课程,我们将准备一个简单的演示食品应用程序,其中显示附近的餐馆。

教练从IOS的基础知识及其对世界的影响开始。 IOS不是开放源代码,不像android,它有自己的优点(安全)和缺点(您看不清执行流程)。 然后我们讨论了GoJek中的IOS,并看到了该应用程序。 我们大多数人从来没有从事过Swift的工作,前两天都是在Xcode 10 Playground上学习Swift的基础知识。 我们了解了界面,快速的最佳实践以及时间复杂度的重要性。

版面

与Android不同,我们在XIB中实现了拖放布局,并使用自动布局来设置约束。 我们不要使用情节提要,因为要在相同的团队中做出贡献非常困难。

穿线

在主UI线程上加载数据和图像确实很不好。 我们应该创建另一个线程来这样做。

列表显示

就像Android中的回收站视图一样,IOS也可以做到这一点,并且可以很好地管理资源。

GoJek代码库

我们看到了代码的结构。 界面和其他最佳实践的使用量。


每天45分钟,我们经常进行口语训练。 原因是

  • 不用担心在人群中讲话。 你得说 你必须传达
  • 确保其他人明白您的实际意图
  • 用逻辑上的说服他人并以真实的逻辑谬论来反驳某人,例如,“论据”,“荒谬的还原”,“逻辑一致性”,“斯特劳曼”,“经验上的充分性”,“传闻证据”等。

说实话与编码同等重要,说实话比编码重要。 并在训练营的同一时期给予了很大的重视。

它在一定程度上下意识地影响了我们,使我们可以随时随地说话,并且在发现异常时可以在逻辑上与某人相抵触。 它给了我们一个辩论的方向。


在过去的EOD之前,我们每天都要进行3场类型的比赛。 目的是使每个人的打字速度都超过每分钟50个单词。 我的打字速度从52 WPM提高到60+ WPM。 打字是我们职业中最不可或缺的部分,打字速度快是一大优势。 您可以在此处检查输入速度。


有很多天,我们在5:00 AM之后睡觉,然后在8:00 AM醒来。 与这些疯狂的人会面,认识他们,与他们一起工作,一起在豆袋上睡觉,与他们一起出去度假,周末喝啤酒,谈论班加罗尔的交通,谈论我们的迷恋,演说上的矛盾,在印度的竞争力赛车,私人休闲频道上的娱乐活动,深夜的家庭作品,互相取笑,同行评议和郊游活动; 这肯定是一个训练营的地狱! 一个旅程的地狱!

您可以通过me@abhinavrai.com与作者联系。