php发展

首页 » 常识 » 常识 » 我的个人项目技术栈
TUhjnbcbe - 2021/6/28 20:07:00

作为一名软件工程师,我很喜欢去研究某个产品或公司背后的技术栈,从产品外在的蛛丝马迹去窥探背后所用的技术栈是一件很有趣的事情。了解不同产品所用的技术栈不仅有助于我开阔眼界,也能提高我个人产品或项目的产出效率,比如发现新的有趣的技术或工具我都会尝试将其融入到我的个人技术栈中。

个人项目追求的是短平快,所选的技术栈和公司项目差异很大。比如很多公司项目的主力编程语言为Java,Java属于很适合大规模协作的工业级语言,优秀的工程化能力使其很适合团队协作。不过它并不适合个人项目使用,有些刻板的语法和笨重的JVM导致其很难运行在低内存的服务器上。

回顾我的一些个人产品或项目[1],所用的技术栈本身也在不断的演进,我始终追求的是使用更高效的工具完成高质量的技术设计与实现。当然技术只是工具,我只是在选择适合的工具去实现我的产品或项目目标。

在看到这篇TheTechStackofaOne-ManSaaS[2]文章时,我产生了写作这篇文章的想法。在接下来的内容中我会将自己所用的技术或工具分享并做简短的点评,这些点评只是我个人的主观感受,某些观点可能存在片面的认知,如果你有不同的想法,欢迎留言与我沟通讨论。

编程语言

编程语言的选择不只反应了一个程序员的品味和追求,同时也会影响他/她的个人思维模式和产出效率。

编程语言的选择可不只是换一种语法,不同的语言具备不同的特点。比如你用PHP开发了一个不错的产品,突然流量大爆发,并发问题很快就出现了。如果大量的添加服务器不仅会在产品收益不明确的情况下增加投资风险,同时也增加了维护成本。个人项目本身就是利用业余时间做的,资金和时间是很有限的,如何在有限的时间内产生最大的收益,编程语言的选择是个重要的影响因素。

除了并发这种一般产品不会遇到的问题,另外一个对开发效率产生重大影响的莫过于语言的表达力,同样的功能,强表达力的语言可以用很少的代码完成,代码量越少出现Bug的机会也越少。比如这篇如何阅读一份代码[3]文章中分析Rails(Ruby)、Django(Python)与Phoenix(Elixir)框架的总代码规模,Phoenix比前两个小了整整一个数量级,可见Elixir的表达力有多强。

表达力另外一个重要的影响在于会影响阅读代码。比如Clojure的Liberator[4]是一个实现HTTP/1.1[5]协议的RESTful库,总代码行数只有1.2K行,如果要研究HTTP协议的话读这个库的源码是个很好的途径。如果换成Java库的话,估计上万行只是一个开始。因为Elixir强大的表达力,其很多库总规模都在几千行之下,这种规模不会让人望而却步。使用这类语言会在不知不觉中,让你被动的阅读了很多优秀的源码,也逐渐提高了使用者的编码与设计能力。

?Elixir[6]—我的主力后端语言。继承Erlang分布式、高并发与容错的能力,有着如Ruby般简洁而强大的表达力,还能以REPL驱动开发[7],这是一门非常适合个人项目的编程语言。我曾用它花费一周业余时间开发出一个峰值日PV达3万的网站[8],考虑到网站的爬虫请求,日请求达10万,仅仅需要一台内存1GB单核CPU的月收费仅5美元的VPS服务器。?Python[9]—万能的胶水语言。我曾用它开发过很多自动化或提升效率的小工具,也用它开发过爬虫、流量站、App和小程序的后台系统,还用它分析过股票交易的一些数据,可以说我的生活离不开Python。?Clojure[10]—可能是JVM生态里最适合个人项目的编程语言了。无论是Java/Kotlin/Scala都不小巧。Clojure是一种Lisp方言,拥有很多Lisp的优点,内核小巧但具备极强的扩展能力。同时能利用Java生态丰富的轮子,不用重复造轮子就是高生产力的体现。Clojure也是全栈,既可以做后端也可以做前端(ClojureScript[11],开源的类RoamResearch[12]的笔记工具Logseq[13]就是使用它开发的)。我在个人项目中还没有使用过它,不过准备尝试在一些个人项目中使用。?JavaScript[14]—Web开发离不开JavaScript,无论你爱不爱它,都离不开它。我的前端技术仅限于开发简单的网站。不过JavaScript的应用范围是越来越大了,除了在网页端的应用,很多跨平台的桌面端程序都通过Electron[15]技术将JavaScript程序封装打包出的。随着Serverless[16]技术的普及,JavaScript也成为Serverless开发第一支持的编程语言,不只可以做Function,也可以实现IaC[17]构建基础设施(如Pulumi[18]中支持用JavaScript描述云服务基础设施)。?Swift[19]—想在Apple生态赚钱离不开的编程语言。早先做iOS开发的时候,我用Swift开发上架过两个App。Swift当时ABI还没稳定,经常从入门到重新入门,语法很不稳定,不过其语言的表达力相比它的老大哥Objective-C还是强不少(曾经用Swift重构过一个App,同样的功能其比Objective-C要少4/5的代码)。如果未来还要在iOS上开发App,我还是会选择Swift。

框架与库

好的框架,事半功倍。

?Phoenix[20]—Phoenix是我用过很好的WebMVC框架。其有着Rails的工程设计,同时具备Erlang平台的高并发容错能力。得益于Erlang的进程管理能力,Phoenix很擅长处理长链接,比如实时聊天或者游戏的应用场景。这篇TheRoadto2MillionWebsocketConnectionsinPhoenix[21]文章分享了在Phoenix单机支持万Websocket长链接的测试。?Django[22]—Django是很适合做CMS管理系统的框架。我用它来做一些App或者小程序的后台管理系统,其可以直接从数据库生成CRUD代码,甚至包括管理界面。?Laravel[23]—PHP语言里最流行的MVC框架。很早的时候简单用过,不过考虑到性能始终是它的达摩克利斯之剑,我最终用Phoenix替代了它。?PureCSS[24]—非常轻量级的响应式CSS库。我用它替代庞大的Bootstrap库,越轻量的库对加载速度的影响越小,而这会潜在的影响网站的用户体验和SEO[25]。?Vue.js[26]—用Vue写过一些简单的页面,个人感觉入门很快。适合后端开发者写前端应用。?NextJS[27]—React框架很复杂,这框架是为了让使用React变得简单。我没有用过这个框架,不过这个框架很火[28],未来的Web应用我会尝试使用这个框架去开发。?TailwindCSS[29]—写CSS一直让我很头疼,大概原因是CSS和正常的编程语言完全不同(并不是图灵完备),有很多难以预料的情况埋藏在冰山之下。这框架是让写CSS像写后端一样简单。听说Tailwind+NextJS[30]配合起来效果更棒。未来我也会尝试用它来替代直接写CSS。?Tushare[31]—量化交易A股必备库。可以很方便的获取各种A股股票和基金行情数据。不过数据质量Pro[32]版本的更高,需要一定的积分才能调用相关API。我的双均线交易策略提醒策略模块[33]就是用此库开发的。?Scrapy[34]—Python第一爬虫库。大多时候我都用Requests[35]库解决刮取(Scrape)数据的问题,Scrapy更适合大规模的爬取网站场景。谨记爬虫玩得好,牢饭吃到饱。

技术架构

?单体应用—单体应用很适合个人项目,和流行微服务架构相反,个人项目追求用简单的架构去快速完成MVP版本。如果架构太复杂了,会导致开发与维护成本达到难以接受的程度。?微服务—我的个人项目没有微服务架构的,倒是公司项目用微服务架构的很多。因为微服务架构更容易将大的功能拆分成不同的微服务模块供不同团队协作开发,同时扩容做起来更容易一些。?Serverless[36]—随着Serverless的逐步成熟,我在最近的一些项目逐渐开始应用。比如本博客的文章阅读统计[37]就是使用Serverless架构开发实现的。这种架构很适合流量比较低的应用,成本相比直接租用单台服务器便宜,哪怕流量起来了服务也很容易弹性扩容。因为个人项目的用户数量一般都比较低,尤其是刚开始流量可以忽略不计,该架构就很适合这种场景,同时可以利用很多云平台的服务完成复杂的功能开发。公司的项目可以配置全功能团队包括DevOps,但个人项目的DevOps工作可以通过Serverless架构转移给云平台。

数据管理

核心是数据。

?SQLite[38]—SQLite是个严肃的数据库[39],甚至是真正的Serverless数据库[40],比如这个datasette[41]库可以将SQLite数据库的数据直接发布成在线数据。我的一些小工具甚至静态化渲染的网站背后的数据库就是它。其还可以用作强大的数据分析平台。要说缺点的话,它的数据库不支持并发写入,这也是我在个人项目中不得不使用重量级的关系数据库。?MySQL[42]—公司项目和个人项目都会用的数据库。MySQL除了有点重量级外,对于个人项目来说没有啥缺点。?PostgreSQL[43]—相比MySQL来说,PostgreSQL支持很多高级特性。比如这个postgrest[44]库可直接将PostgreSQL数据库发布成RESTAPI,甚至有基于此库的SaaS服务如supabase[45]可提供类GoogleFirebase[46]的功能。?Redis[47]—Redis本身的功能很丰富(缓存、计数、分布式锁与排行榜等),不过我在个人项目中主要用来做缓存。?AWSDynamoDB[48]—AWS的NoSQL数据库。它的优势在于可以作为以AWS众多服务构建Serverless架构的数据库,比如本博客的阅读量数据就是存放在此服务上的。?AWSS3[49]—价格便宜的无限存储服务。S3的玩法很多:

?爬虫爬取的数据可以存放上去,比如GHArchive[50]定时爬取GitHub各类事件然后存储至S3以供进一步做大数据分析;?定时生成的静态页面存放上去,我有一个网站就是通过定时程序生成几十万静态页面托管上去的;?将日志存放上去做进一步的分析,比如网站的请求日志存放上去通过AWSAthena[51]以SQL形式查询做数据分析。

?GoogleSheets[52]—GoogleSheets不只是个具备实时协作的电子表格。它还可以:

?可作为数据库。比如Sheety[53]这个服务可将电子表格作为数据库并发布成API以供应用去消费数据;?可作为CMS系统。比如结合AWSLambda可做出一个博客后台管理系统[54]。比如我的社交数据监控Dashboard[55]后台就是GoogleSheets,结合AppsScript[56]可以做到自动获取最新社交数据。

基础设施

个人项目的关键在自动化,自动化的重点在基础设施。云平台

?AWS[57]—除了有点贵,其他都很好的云平台。AWS的一些服务很便宜但某些非常贵,在全面应用个人项目时最好先踩坑测试了解下。对于个人开发者来说加入AWSCommunityBuilders[58]是个学习AWS不错的途径,有啥问题可以直接在社区请求支持。我在学习测试了小半年后将个人项目全面转向了AWS平台。

?S3—无限存储。适合部署静态网站,费用便宜。还可以存放日志等各种文件。?CloudFront-访问速度并不快的CDN,结合S3服务可以直接部署静态网站。?SQS—标准队列+FIFO消息队列,如果个人项目中需要MQ的话可以考虑使用这个。?SNS—推送服务,支持邮件、短信及App推送。我在双均线交易策略提醒模块[59]就是使用此服务实现的。?EC2—弹性计算服务器。个人项目对实时性要求不高的服务或者一些后台任务可以选择Spot实例,比如我的一个开源项目中使用Spot实例购买的单核1GB内存的服务器一个月的花费只有不到3美刀。这比很多VPS服务商的价格都便宜。?Lambda—按需收费的Serverless计算服务。比如本博客的图片优化功能[60]就是使用此服务运行的。?Dynamodb—见数据管理[61]里的介绍。?CloudWatch—可查看各服务的日志,调试Lambda必备。还可以做定时任务,最小分钟级别。?ECS—运行Docker的服务。?ECR—存放自定义Docker镜像的私有仓库。?Fargate—适合任务型服务,冷启动时间超过一分钟,按秒计费,需结合ECS/EKS运行。比如我在双均线交易策略任务模块[62]中使用此服务定时生成交易信号。?CloudFormation—AWS的IaC,基础设施代码化。比如我用这个aws-ethereum-miner[63]模版去启动EC2集群挖矿。?CertificateManager—HTTPS证书管理服务,我所有的域名TLS证书都用它免费申请的。?APIGateway—API网关,我一般用它做Serverless架构的RESTAPI网关。?Billing—时刻

1
查看完整版本: 我的个人项目技术栈