Giter Club home page Giter Club logo

somestuff's Introduction

根据我开发LPOJ的经验,我把开发一个产品总结为如下几个过程

假如产品经理给了你一个需求,你要做什么?

这里撇开市场资本因素不谈,仅谈技术,因为市场因素,应该是产品经理所要思考的东西,我们要做到的就是把这个产品做好,怎么把事故率降到最低。

这里从上至下,从0到开发完成,开始谈谈我的看法。仅代表个人浅显的理解观点。

1. 主要技术选型

我认为第一步要做的,是选好一门开发技术。比如做游戏,你要使用哪一款引擎,开发前端你要使用哪一个框架,后端要使用哪一个框架。这里说的是整个产品的代码占最大部分的地方。比如开发APP,使用哪一门语言? 以LPOJ为例:

前端:首要是 Vue.js + Element 后端:Python Django REST Framework 判题机:Python APP:手机版网页

2. 次要技术选型

这里的次要技术主要是指辅助你开发的各种工具和数据库。当然,这一部分的考虑是需要结合主要技术选型的。如果Django就对MongoDB的支持还不够完善,这个时候我们就要考虑数据库使用哪一种比较好。还有其他一些工具,比如版本管理等。 以LPOJ为例:

版本管理:Git 开发工具:VSCode 操作系统:Ubuntu 数据库:MySQL 项目管理工具:GitHub Project(Github的新功能)

3. 服务的划分

这一步很多人在刚开始的时候,都是边做边想的,但实际上,这一层至关重要,我们必须尽早的确定下来。因为很多时候,开发到一半,会发现服务之间,耦合非常的严重,导致整个服务非常的臃肿,不便于维护管理。这一步通常叫做模块的划分,我们要把整个产品划分好各个模块,每一个模块都可以单独的进行测试,这样就可以很方便我们维护。 以LPOJ为例:

  1. 前端
  2. 后端
  3. 判题服务器
  4. 判题机
  5. 爬虫服务

4.服务间的通讯方式

服务划分完之后,就要考虑服务间怎么通讯了,在我开发LPOJ的时候,可以说是边开发边思考的,遇到了需求就随便的找了一种实现方式,但这其实不可取的。因为现在越来越多的通讯方式供我们选择了,每种方式都有他们优缺点,因此我们要提前确定下来。这里的通讯方式也包括与数据库的通讯方式。而且服务间的通讯方式,也决定了我们后期运维时的各种细节。 以LPOJ为例:

  1. 前端和后端使用 Axios库通讯(类REST型API)
  2. 判题服务器和判题机使用TCP通讯(这里其实有更优的解决方案,比如ZMQ或RPC)
  3. 判题机和数据库采用Python提供的MySQL接口

5. 设计模式

这个时候已经是开始开发的过程了,在开发的过程中,我们要提前确定我们的设计模式。这些模式都是前人总结下来的经验,非常有利于敏捷的开发。确定好设计模式后,我们就开始搬砖了!

以LPOJ为例:

  1. 前端 MVVC (Vue.js决定的)
  2. 后端 MVC (Django决定的)
  3. 判题机 无 (工程比较小,没有体现设计模式的**)

实际上,在大型项目开发中,这非常的重要。

6. 文档编写

我认为,在开发过程中,就要开始文档的编写。为什么要写文档?你不写,后人不会使用你的系统,你不写,后人无法维护你的代码,你不写,你自己也无法维护你自己写的代码。一般一个月不碰你自己的代码,基本上就忘光了。所以写文档非常的重要。而且边开发边写,因为你开发完后,你很可能已经忘了你以前写的代码逻辑是怎么样的了。而且我认为,文档可以分为两类,一类是给使用人员看的,一类是给开发人员看的。其中使用人员也包括开发人员,比如开发人员有时候要使用你开发API,你要告诉他怎么使用。开发人员的文档,可以写在注释里,使用人员的文档可以做成一个文档网站,这样比较方便。而且现在也有非常多的写文档的工具,一键就能生成非常好看的文档!比如LPOJ使用的就是 VuePress.js.

7. 确定部署方式

到了这一步,恭喜你,你已经完成了搬砖的过程,接下来就是发布你的程序了。在开发过程中,你的环境,我们称之为开发环境,这个环境可以方便你调试,你可以看到各种调试信息,比如npm run dev。但是如果我们要把这个产品发布,你不能直接发布源代码,而是发布一个产品,这个时候,我们就把你发布的环境叫作生产环境。生产环境是不应该出现各种调试信息的,因为这样很不安全。而且通常一些框架都会自带一个测试环境给你测试,但是这个环境效率通常都比较低,因此我们要确定我们的部署方式,就是如何交付你的产品。 以LPOJ为例

  1. 前端 Nginx (一个非常高效的Web服务器,用户访问我的网站相当于访问这个服务器,这个服务器可以高效的把网页发送给用户)
  2. 后端 unicorn + gevent (通过Python manage.py runserver的方式是使用Django自带的Web服务器来启动服务器,是单线程而且很低效的,通过使用多进程+多线程的形式,让你的后端变得高效起来)
  3. 判题机 直接python main.py

8. 接入运维系统

这个过程才是发布你的程序的最后一道关卡。一种低端的方式,就是把服务部署在各个服务器上,然后用户访问你的服务器就OK了。但是万一某一个服务崩了,极端情况下,你要一一检查各个服务器,再看看这个服务器中哪个服务崩了。在项目做大以后,这会非常的耗时间,因此我们需要接入一个运维系统,可以非常直观的查看你的服务,并且可以动态调整你的服务。通常这一步都离不开Docker,你需要把你服务打成一个镜像,然后运维系统就会运行你这个镜像。当然这其中涉及的东西非常的复杂。通过运维系统我们做很多上层的事情,比如主机资源管理,服务调度,服务间负载均衡,证书管理,版本管理等等!然后我们可以结合监控系统,把我们的服务都监控起来,一旦出现问题可以迅速恢复。常见的运维系统有K8S。以LPOJ为例,一开始使用的是Docker-Compose,后来改成了RancherServer。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.