作者是各自领域的专家,并就其所展示经验的主题撰写文章. 我们所有的内容都由同一领域的顶级专家同行评审和验证.
亚历杭德罗·埃尔南德斯的简介

Alejandro Hernandez

Alejandro拥有软件工程学士学位,在各种规模的软件公司有10年以上的工作经验.

Previously At

Globant
Share

La Historia

所以你和你的联合创始人有一个很酷的商业想法,对吧??

你一直在你的头脑中添加特征.

经常问你的潜在客户他们的意见,他们都喜欢你.

好吧,那么人们想要它. 甚至有一点钱可以赚. 他们不能得到它的唯一原因是你还没有实现它.

最后,有一天你坐下来说,“让我们来做吧!”!”. Pronto, 您正在试图弄清楚如何应用应用程序的业务逻辑, 将推动产品发展的杀手级功能:你有一个如何做的想法, 现在你知道你能做到.

“¡Listo!¡Funciona!” dices. 你的概念证明是成功的! 剩下要做的就是将其打包到web应用程序中.

“好吧,让我们建个地方吧,”你说.

Y entonces, te das cuenta de la verdad: necesitas elegir un lenguaje de programación; necesitas elegir una plataforma (moderna); necesitas elegir algunos frameworks (modernos); necesitas configurar (y comprar) espacio, base de datos y proveedores de alojamiento; necesitas una interfaz de administración; necesitas un sistema de permisos; necesitas un administrador de contenidos.

你想要简洁,你想要敏捷. 你想要使用能够帮助你在短期和长期内取得成功的技术. 它们并不总是容易选择的

你必须做出几十个架构决定 . 你想要选择正确的:你想要使用能够让你快速发展的技术, iteración constante, máxima eficiencia, velocidad, robustez y más. 你想要简洁,你想要敏捷. 你想要使用能够帮助你在短期和长期内取得成功的技术. 它们并不总是容易选择的.

“我不知所措,”你说,而你却感到不知所措. 你的精力和以前不一样了. 你试着把碎片拼在一起,但工作太多了.

你的概念证明会慢慢消亡.

La Propuesta

在放弃了很多这样的想法之后,我决定设计一个解决方案. 我称之为“项目”Init’ (Inicio)(ó init.js).

这个想法的核心是有一个简单的项目来启动所有其他项目, 让开发人员或技术创始人同时做出这些决定,并根据这些决定获得合适的模板. 我知道批评者会说什么, “一种解决方案不可能适用于所有问题”(讨厌者会讨厌). 他们可能是对的. 但我们可以尽最大努力创建一个近似的解决方案,我认为 Init se acerca bastante.

为了更好地实现这一目标,我们必须牢记一些关键的想法. 在开发Init时,我考虑:

  • Componentes

    模块化是任何系统的关键特性,因为它允许您在不同的项目中重用软件组件——这是我们的主要目标 Init. 但模块化也伴随着产品的“可替代性”, 在用“几乎”相同的解决方案解决各种问题时,哪一个将是我们最好的盟友.

  • 易于开发

    对于某些问题,在某个地方有一个更好的解决方案 [Brainf*ck](http://en.wikipedia.org/wiki/Brainfuck). ó jodecerebros). 但是实现这个解决方案(在 Brainf*uck几乎不可能写,更不用说读了. 这将花费你大量的时间和精力. En general, 您应该使用易于开发的语言和平台, 这对你(或者以后可以和他一起工作的人)来说并不困难.

  • Comunidad

    你选择的任何平台, 确保你有一个很棒的社区, 一个可以帮助你解决最常见的问题和那些不太常见的问题. 记住:jQuery可能不是更多的库 rápida, la más limpia,或者是最优雅的——但它是赢家只是因为它 comunidad.

考虑到这些目标,我将向你展示我是如何做出自己的决定的 Init.

在其核心,Init利用了范例full-stack JavaScript(有些人把它或它的一部分称为 MEAN Stack). 当使用这个集合时, Init 能够只使用一种语言,同时创建一个令人难以置信的灵活和功能齐全的环境来开发web应用程序. En resumen, Init 允许您不仅在客户端和服务器端开发中使用JavaScript, 但也要建造, testear, maquetar, y más.

但让我们放慢速度,问问自己:使用JavaScript真的是个好主意吗?

为什么我选择JavaScript

我从1998年开始就是一名网页开发人员. 那时我们使用Perl 用于我们的大部分服务器端开发, 甚至从那时起,我们就在客户端使用JavaScript. 从那时起,服务器端web技术发生了巨大的变化:我们经历了一波又一波不同的技术和语言,比如PHP, ASP, JSP, .NET, Ruby, Python,等等. 开发人员开始意识到,在客户端和服务器环境中使用两种不同的语言会使事情变得复杂. 在同一语言下统一的最初尝试是在服务器端创建客户端组件,并用JavaScript编译它们. 这并没有像预期的那样工作,许多项目都失败了(例如, ASP MVC reemplazando ASP的web表单.NET我们可以这么说 GWT será reemplazado por Polymer). 在不久的将来). 但这是个好主意, 本质上:客户端和服务器上的单一语言, 允许我们重用组件和资源(这是关键: recursos).

答案很简单:在服务器上使用JavaScript.

事实上,JavaScript与生俱来 JavaScript服务器端 在网景企业服务器上,但当时的语言还没有准备好. 经过多年的试验和错误, Node.js finalmente emergió, 这不仅把JavaScript放到了服务器上, 但它也促进了 no-bloqueante编程,永远改变我们写“fread”(I/O)的方式 aquí.

一句话:非阻塞编程旨在将耗时的任务放在一边, 通常指定这些任务完成后应该做什么, 同时允许处理器处理其他订单.

但这些想法并不新鲜——那么为什么它们在Node中如此受欢迎呢.js? 简单,非阻塞编程可以通过不同的方式实现. 也许最简单的方法是使用回调和 evento en bucle. 在大多数语言中, 这不是一件容易的任务:虽然“回调”在某些语言中是一个常见的特性, 循环事件不是,你通常会发现自己依赖于外部库(例如:Python), con Tornado). 但在JavaScript中, callbacks 是建立在语言内部的吗, 以及循环中的事件, 几乎任何尝试过JavaScript的程序员都熟悉它们(或至少使用过它们), aunque 不完全理解循环事件的含义). 突然间,地球上的每一家初创公司都可以重用开发人员(例如.,资源)在客户端和服务器端,解决 “需要Python大师”的问题.

突然间,地球上的每一家初创公司都可以重用开发人员(例如.,资源)在客户端和服务器端,解决 “需要Python大师”的问题.

现在我们有一个 难以置信的快速平台 (感谢非阻塞编程)使用一种非常容易使用的编程语言(感谢JavaScript). Pero, ¿Es suficiente? ¿Perdurará? 我相信JavaScript在未来会有一个重要的位置. 让我来告诉你为什么:

  • 函数式编程

    JavaScript是第一种编程语言 领导功能范式 对大众(当然), Lisp llegó primero, 但是大多数开发人员从来没有在Lisp中构建过一个可以用于生产的应用程序). Lisp y Self, Javascript的主要影响,充满了创新的想法. 这些想法可以解放我们的思想,探索新的技术、模式和范式. 所有这些都指向JavaScript. Mira monads, codificación Church,甚至(更实际的例子)函数集合](http://underscorejs.org/#collections), de Underscore.js 这可以为您节省一行又一行的代码.

  • 动态对象和原型继承

    没有类(也没有无穷无尽的类继承)的面向对象编程允许快速开发(创建对象), 添加方法并使用它们)但是, lo más importante, 通过允许开发人员修改对象实例而不是类,减少维护任务期间的重构时间. 这种速度和灵活性为快速发展铺平了道路.

  • JavaScript是互联网

    JavaScript fue 专为互联网设计,从一开始就在这里,而且 no va a irse. 所有摧毁它的尝试都失败了,例如,看看 Applets Java,替换VBScript 微软、手稿 (编译成JavaScript),以及Flash落入移动市场和HTML5手中. 如果不破坏数百万个网页,就不可能替换Javascript, 所以我们的长期目标应该是改善它。. 没有人比他更适合做这项工作了 技术委员会39 de ECMA.

    好吧,JavaScript的替代品每天都在诞生 CoffeeScript, TypeScript, y los 数以百万计的语言编译成JavaScript. 这些替代方案可能对发展阶段有用(通过 源代码映射), 但从长远来看,他们无法取代JavaScript,原因有二:他们的社区永远不会更大, 它的最佳功能将被ECMA脚本采用(例如., JavaScript). JavaScript不像汇编语言:它是一种高级编程语言,源代码你可以理解——所以你应该理解它.

Ahora, gracias al proyecto Esprima, 您可以创建自己的工具来使用源代码, modificándolo, cambiando su estilo, 添加评论, instrumentando, 以及在玩程序的抽象语法树时可以想象到的各种事情,就像你在玩DOM树一样.

端到端JavaScript: Node.js y MongoDB

这些就是使用JavaScript的原因. 现在,我将使用JavaScript作为使用Node的理由.js y MongoDB.

  • Node.js

    Node.js是一个构建快速、可扩展网络应用程序的平台——这基本上是Node网站所说的.js. Pero Node.js不仅仅是:它是任何具有JavaScript i / o访问的应用程序的首选执行环境. 即使您不打算使用Node编写主服务器应用程序.js,您可以使用构建在Node之上的工具.js来改进你的开发过程. Por ejemplo: Mocha.js para unit testing, Grunt.js 用于自动化施工任务,甚至 Brackets 完成代码编辑.

    Entonces, 如果您要为服务器或客户端编写JavaScript应用程序, 您应该熟悉Node.js,因为你每天都需要使用它. 有一些有趣的 alternativas),但没有一个达到节点社区的10%.js.

  • MongoDB

    MongoDB es una base de datos NoSQL 基于使用JavaScript作为查询语言的文档, 允许完整的端到端JavaScript平台. 但这甚至不是选择这个数据库的主要原因.

    MongoDB es una 无模式数据库 它允许以灵活的方式持久性对象,从而更快地适应需求的变化. Además, es altamente escalable y basado en map-reduce,这使得它适合数据量大的应用程序. MongoDB非常灵活,可以作为一个没有模式的文档数据库使用, 关系数据存储(尽管它缺乏 transacciones),甚至是缓存响应的键值存储.

使用Express进行服务器模块化.js

服务器端模块化从来都不容易. Pero con Express.js (y Connect.js) vino la idea de ‘middleware’(或中间软件). 在我看来,中间件是在服务器上定义组件的最佳方法. 如果你想将它与已知的模式进行比较,它非常接近管道和过滤器.

基本的想法是,你的组件是管道的一部分. 管道处理请求(输入)并生成响应(输出), 但是您的组件不负责完整的响应. 相反,它只修改你需要的东西,然后委托给管道的另一部分. 当管道的最后一块完成其处理时,响应被发送给客户端.

我们将这些“管道部件”称为“中间件”. 显然,我们可以创建两种类型的 middleware:

  • Intermedios:处理订单和响应的人, 但他们对答案本身并不完全负责, 然后委托下一个中间件.

  • Finales:在最终答案中承担全部责任的人. 他们处理和修改订单和响应, 但不需要委托下一个中间件. En la práctica, 建议委托下一个中间件, de todas maneras, 为了实现架构的灵活性(例如., 稍后添加更多中间件), 即使中间件不存在(在这种情况下,响应将直接发送到客户端)

作为一个具体的例子,考虑服务器上的“管理员用户”组件. 在中间件方面,我们将有终端和中间件. 对于我们的终端,我们将拥有诸如创建用户和列出用户等功能. 但在我们采取这些行动之前, 我们需要中介进行身份验证(因为我们不希望创建未经身份验证的用户的订单). 一旦我们为身份验证创建了这些中介, 我们可以简单地将它们连接到任何我们想要的地方,将一个没有现有身份验证的特性转换为一个有身份验证的特性.

单页应用程序

El proyecto Init enfoca en crear 单页应用程序(spas -单页应用程序). 许多web开发人员已经不止一次地尝试建立水疗中心. 使用几个(主要是专有的)开发, 我可以自信地说,它们就是网络应用的未来. 你有没有把水疗中心和普通的移动网络应用程序做过比较? 响应差是几十秒.

你有没有把水疗中心和普通的移动网络应用程序做过比较? 响应差是几十秒.

SPA是网络的未来——那么你为什么要用旧的形式来制作你的产品呢? 我听到的一个常见论点是,人们担心SEO. 但如果你处理正确,这应该不是问题:谷歌本身有一个 muy buen tutorial 关于如何做到这一点,有很好的反馈 aquí también.

MV*客户端主干.js, Marionette.js和Twitter Bootstrap

关于这一点已经说了很多。 MVC*水疗框架. 这是一个复杂的决定,但我要说的是前三名是 Backbone.js, Ember.js, y Angular.js.

这三个都很受欢迎. 但是哪一个最适合你呢?

不幸的是,我不得不承认我对Angular的经验非常有限.js,所以我就不讨论了. Ahora, Ember.js y Backbone.js代表了解决同一问题的两种不同方法.

Backbone.js 它是极简主义的,简单的,并提供足够的创建一个简单的水疗中心. Por otro lado, Ember.js是一个完全专业的框架来创建水疗中心. 它有更多的装饰,但也有更大的学习曲线.

取决于应用程序的大小, 做出决定就像查看featuresUsed/featuresAvailable的比例一样简单。, 这将给你一个很好的提示.

En el caso de Init,我想涵盖大部分场景,所以我选择了Backbone.js轻松创建水疗中心,与骨干.Marionette.模块化视图. De esta forma, 每个组件都是一个简单的应用程序, 最终的应用程序可以像我们希望的那样复杂.

风格也是一个挑战,但我们可以依靠框架来拯救我们. 对于CSS,没有什么比这更好的了 Twitter Bootstrap,它提供了一套完整的样式,已经准备好使用了 易于定制.

Booststrap是用这种语言创建的 LESS 它是开源的,所以如果我们需要的话,我们可以修改它. 它有大量的可用性控制 在Bootstrap网站上有很好的记录. Además, hay un 个性化模型 允许您创建自己的控件. 他绝对适合这份工作.

最佳实践:Grunt.js, Mocha.js, Chai.js, RequireJS和CoverJS

Finalmente, 我们应该定义一些我们的最佳实践, 并研究Init如何帮助您实现和维护它们. 我们的解决方案专注于各种工具,这些工具基于Node.js.

  • Mocha.js and Chai.js:

    这些工具允许您通过应用程序改进开发过程 TDD o BDD, 提供组织单元测试的基础设施和自动运行单元测试的启动器.

    Hay miles 从框架到JavaScript的单元测试. 那为什么要用摩卡呢.js? 简而言之:它是灵活和完整的.

    长答案:它有两个重要的特性(接口), 记者)及重大缺席(assertions). Déjenme explicarles.

    • Interfaces:也许您已经习惯了套件TDD和单元测试的概念, 或者你更喜欢BDD的行为规范想法describe” y “it should”. Mocha.js允许您使用这两种方法.
    • Reporters:运行测试将生成结果报告, 你可以使用多个记者对这些结果进行格式化. Por ejemplo, 如果您必须为持续集成服务器提供动力, 你可以找个记者来做这件事.
    • 缺乏断言库::远不是问题,摩卡.js的设计允许您使用您喜欢的断言库, 提供更大的灵活性. Hay muchas opciones但这就是柴的地方.js entra en acción.

    Chai.js是一个灵活的断言库,允许使用三种最重要的断言样式中的任何一种:

    • Assert:经典的老派断言风格. Ej.:

        assert.equal(变量,“价值”);  
      
    • Expect: BDD中最常用的可链断言类型. Ej.:

        expect(variable).to.equal(“valor”);
      
    • Should:也用于BDD, 但我更喜欢Expect,因为它应该,因为它听起来重复的行为规范_ ' it _..-“这应该有所帮助”). Ej.:

        variable.should.equal(“valor”);
      

    Chai.js与摩卡完美结合.js. 只使用这两个库, 你可以用TDD写测试, BDD, 或者任何你能想到的风格.

  • Grunt.js:

    Grunt.js允许自动化构建任务, 任何东西,从简单的连接文件复制和粘贴, a预编译模板, 编译的语言风格(例如., SASS和LESS),单元测试(使用摩卡.js), linting和代码压缩(例如., con UglifyJS o Closure Compiler). 您可以将自己的自动化任务添加到Grunt中,或者在 registro de Grunt, 哪里有成百上千的插件可用(回到, 使用拥有大型社区的工具,回报丰厚). Grunt también puede 监控您的文件 并在修改动作时触发动作.

  • RequireJS:

    RequireJS听起来可能是加载模块的另一种方式 AMD但我可以向你保证,它远不止于此. 为了理解其中的原因,我们必须首先提到模块名称空间的概念(例如., demo.views.hello),避免污染全局命名空间,将每个模块包裹在自己的命名空间中. El problema es, 这些模块是不可重用的:如果您修改“实例”的名称空间, 您正在修改所有“实例”的名称空间. 相比之下,RequireJS允许从一开始就定义可重用的模块. (此外,它将帮助你采用 Dependency Injection para 防止模块访问全局变量).

  • CoverJS:

    Cobertura de código 它是评估测试的度量标准. 顾名思义,它告诉您当前测试集覆盖了多少代码. CoverJS通过检测语句(而不是像这样的代码行)来衡量测试的代码覆盖率 JSCoverage)并生成代码的工具化版本. 它还生成报告来提供您的服务器 integración continua.

使用_Branches_ (_ramas_)切换特性

Cuando empecé Init, 需要一种方法让用户激活和禁用他们可能想在项目中使用的各种功能. 我决定对git分支系统采取一种激进的方法来实现这个功能.

En esencia, 每个分支代表用户可能希望包含的特性或功能. 如果你从一开始就开始一个项目, 从你需要的最小分支开始, 然后通过将分支与其他需要的分支合并来添加其他技术. 例如,假设您想用Backbone开始您的项目.js y Marionette.js. 你可以从骨干分支开始.并将其与Marionette分支合并, 从这里继续您想要添加的每一个功能.

Por ahora, 合并以添加功能的想法只能用于技术模板(例如.主干、节点、Express). 但在未来,您将能够在后端之间切换(例如.,从MongoDB到Postgres)和客户端实现.

用Init开始一个项目,并在Heroku上部署今天

从来没有比这更容易的方法来启动一个项目. Dirígete al GitHub存储库, 用最新的提交修复分支(现在是usermanager), 虽然这在未来可能会改变),然后:

  1. 为项目创建一个目录(或使用现有目录).
  2. 使用“git init”创建存储库(或使用现有存储库)
  3. 使用Init添加远程服务器

     git远程添加init git: //github.com/picanteverde/init.git
    
  4. 下载你想要的分支

    git拉init用户管理器
    
  5. 获取Heroku进程文件

     git拉init heroku-webprocess
    
  6. Con el Heroku Toolbelt 安装后,创建应用程序

     heroku create
    
  7. 推到Heroku的主分支

     git push master
    
  8. 访问您的应用程序运行在Heroku!

现在,只需几行代码,您就可以开始开发杀手级特性. No solo eso, 而是在一个尽可能自动化的开发套件中使用最新和最有效的技术进行开发.

我希望你能使用 Init 开始你的下一个伟大的想法. 记得检查Init存储库的修复和特性——它的开发非常活跃, 我期待听到你的反馈.


内容由Pablo Fabregat翻译,成员 TransBunko,技术翻译市场.

在这个话题上聘请一位顶级专家.
Hire Now
亚历杭德罗·埃尔南德斯的简介
Alejandro Hernandez

Located in 科尔多瓦,科尔多瓦,阿根廷

Member since October 30, 2012

About the author

Alejandro拥有软件工程学士学位,在各种规模的软件公司有10年以上的工作经验.

Toptal作者是各自领域的专家,并就其所展示经验的主题撰写文章. 我们所有的内容都由同一领域的顶级专家同行评审和验证.

Previously At

Globant

世界级的文章,每周交付.

订阅意味着同意我们的 privacy policy

世界级的文章,每周交付.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.