随后 | 现在 | 之后

发布: (2025年12月10日 GMT+8 04:38)
8 min read
原文: Dev.to

Source: Dev.to

tūm (pronounced /tuːm/) — “then,” “at that moment”; a glance back at what once was and the moments that shaped the beginning.

mŏdō (pronounced /ˈmɔ.doː/) — “just now,” “only now”; a grounding in the present, the point of clarity from which everything is assessed.

postĕā (pronounced /ˈpɔs.tɛ.aː/) — “afterward,” “later on”; a forward‑looking view toward what may unfold from this moment onward.

鉴于我重新点燃了对这个小博客的兴趣,而且现在快到圣诞节了,这似乎是个合适的时机来一点点查尔斯·狄更斯的风格,回顾一下我的过去、现在和未来。我之所以重新捡起这件事,部分原因是我终于在这份工作上站稳脚跟,已经有了几年的时间,而且现在不再一直忙于追赶大家的进度。并不是说处在追赶的循环里是坏事——那是一个巨大的学习机会,让我大量提升了技能,也真的为我的全栈开发武器库增添了不少实战经验。我觉得回顾一下自己刚起步时的状态、诚实评估当前的状况,然后看看在不太遥远的将来想走哪些方向,是一次值得的练习。

Then

回到 2023 年 11 月,我为了工作第一次乘机返回英国,参加 Fusions PIM Ltd 的初始培训。当时我已经有几年的网页开发和 Laravel 经验,所以并不是完全的新人。那时的简历列出了以下核心技能:

  • Laravel(2 年经验)

    • 为已有项目实现客户需求的功能
    • 为一家基于订阅的零售公司从零搭建 CRM 与知识库
  • Docker

    • 熟悉在开发容器中工作
    • 在裸服务器上托管 Docker 化的 Web 应用
    • 使用容器“试用”技术栈的不同组件
  • 开源

    • 发起并维护一个小型网页爬虫项目,旨在为初学者提供尝试开源软件的机会

公平地说,我的起步并不算差,因为我第一次接触这个领域是在 2021 年完成我的第一套 Laracasts 教程。但当时我的真实工作经验和对行业的影响几乎可以忽略不计。回头看,我有点惊讶这家历史悠久的公司竟然给了我机会,也非常高兴他们这么做了。

我用软技能来弥补经验的不足:清晰的沟通、敢于提问(即使问题看起来有点傻)以及不断提升自己的水平。之前的岗位让我拥有极大的自主权来管理自己和工作量,这一点在我来到这里后也没有改变,尽管公司在客户透明度和协作上技术上“必须”更加有组织。我可以随时向任何新同事请教或寻求帮助,同时我仍有时间去阅读阅读阅读

我现在所在的代码库早在我学会 PHP 的任何函数之前就已经存在。部分类仍然使用多年前的语法——这是一只真正的遗留怪兽。虽然大部分已经转化为 Laravel 应用,但仍有不少老旧的怪癖因为对业务太关键而不敢轻易改动,所以保持原样。感觉像是被锁在时间裂缝里,但当时我并未意识到这带来的好处。

转换进行中的背景

  • 该应用从一开始就拥有非常类似 Laravel 应用的结构。
  • 已经在使用 Laravel 所依赖的许多 Symfony 组件。
  • 差异最大的部分是较早期的安全实现。

Now

快进几年,同样神秘且庞大的 PHP 应用已经几乎 100 % 转换为现代 Laravel 应用,这要归功于新老同事的共同努力——也包括我自己。参与这次转换的最大收获是,我必须对 Laravel 框架有更深入的理解,因为剩下要转换的部分是最具挑战性的。我觉得自己最深入的领域是 EloquentCommands,但几乎遍历了框架代码库的所有区域。

Eloquent

代码库中较老的部分使用了传统的 PHP 语法,例如:

$sql = "SELECT * FROM `some_table` WHERE `x` = 'y'";

因此我有大量机会阅读、理解原始 SQL 并用 Eloquent 查询重写它。整个应用大量涉及基于模型关系的搜索过滤,所以我必须掌握定义和使用关系进行查询的技巧。多年来,Eloquent 的关联查询方法每周都在改进,我也不断收到提升 性能开发者体验 的新方法。

我最喜欢 Eloquent 的地方在于它的可读性,尤其是关联查询。往往不需要过多思考,因为像下面这样的写法:

withWhereHas('relation', fn ($query) => $query->condition())

会直接告诉你结果会包含什么。

Commands

我对 Symfony 的欣赏无以复加,因为我真的在文档的战壕里只针对 console 部分深耕,而它保持的根本简洁性真的很棒。个人认为 Laravel 在借用了这些功能的同时,掩盖了一些简洁性。例如,当你组合测试助手时:

$this->artisan(Command::class)->expectsTable([...])

Laravel 假设你已经定义了表格的样式。如果没有,你会一时摸不着头脑,搞不清为什么测试会失败,因为 Laravel 默认的表格样式并不等同于 Symfony 的默认样式 🫤。

除这些小细节外,命令的功能非常强大,甚至激发了一些我稍后会探讨的设想。

Overall

在这段时间里,我既写代码,也阅读并审查了大量高质量代码,这极大提升了我的编码风格和解决问题的思路。我对目前的状态感到满意,但也清晰看到了自己的提升空间,并会继续追求进步。

我在工作之外仍坚持练习,例如使用 CodeWars,并尝试保持对 PHP 与 SQL 之外语言的兴趣——主要是 Bash 与 Go,最近也在钻研 C++。因为已经达到了这个舒适层次,我挑起了一个小的副项目,希望能够再次保持写代码的习惯,因为这确实有助于深化我的个人理解。

Back to Blog

相关文章

阅读更多 »