草庐IT

我的十年编程路 2019年篇

编程二三事 2023-03-28 原文

随着2018年,三星天津研究院的裁撤,我选择了到广州的三星研究院工作,与最心爱的她开始一起生活。

这一年的开始,我注册了博客园。和2014年类似,在刚注册不久,我写了一篇题为《全新开始,全心出发》的文章。在这篇文章里,我又一次刨析自己,深入内心。

从网站的风格样式上看,博客园并无优势,甚至在某些地方还是21世纪初的样子。但也正因为如此,它更加纯粹和朴素,广告更少,更加专注内容,专注在技术本身。

当时的我,已经工作有5年多,心慢慢地变得踏实下来。5年这个时间长度,并不算太久,我还能走得更远。在这篇文章里,我写了这样一段话,这段话一直是我坚守的人生信条,也是支持我努力奋斗的动力源泉:

在三星通信研究院工作,对我而言是一件幸福的事情。在这里工作强度不是一直都很大,有时间自我学习。我始终认为,在人生的现阶段,投资自己是最重要的,而不是每个月到底能挣几个钱,因为发财没办法靠打工。即使年薪30万,50万又能如何呢?不吃不喝,一年下来,也不能在一线城市买下一套房,也不能买下自己心爱的座驾。更何况,即使买的下来这些,也不能保证自己不去要更多的东西,那样的人生不是我想要的。或许那样真的可以让自己这一生过得很舒服,但是舒服过后依旧会归于尘土。但如果我们真的可以在人间留下来点什么,留在了某些人的记忆中,这意味着这些人将带着我们的精神,带着我们的经验活下去,甚至传承下去。在某种意义上讲,这将是一种永生。

写博客对我而言就是实现理想的一种方式,我希望通过文字和图片记录下我在编程路上踩过的各种“坑”和探过的各种路。这对于尚未遇到“坑”和打算走新路的朋友来说,多少都会有一些帮助。虽然到今天,我仍然没有当上老师,没能站上讲台,但只要能够起到帮助和引导的作用,做事情的形式还显得那么重要吗?

没错,“坚持初心”这四个在我眼里,并不是说一定要实现某件事。它更像是一种“核心原则”。儿时的我特别向往老师这个职业,觉得教书育人很高尚。虽然最终没有走上老师这条路,但是能把知识分享给需要的人,能真正地帮助到那些需要帮助的人,也是我的价值的体现。换句话说,我的理想,就是学习,然后输出。这样看来,当老师是实现方法,写博客是实现方法,写书也是实现方法。

坦率地讲,这里面也不乏一些“私心”,如果你看过我写的这篇文章,会发现我在其中还摘录了这样一段话:

说到“世俗”的一面,我的理想就是提高自己的知名度,让自己在这个世界上留下些许存在过的印记。它或许是一篇文章,或许是一段代码片,或许是一张照片,甚至只存在于某个人或某几个人的记忆中。这和我少年时期想要当一名老师的理想并不冲突。经过成长的洗礼,最初的梦想经过升华变作了某种执念和精神,又化作了条条通往理想之门的大路。我逐渐意识到,自己少年时期的梦想只是一种具象化的结果。在每一次静静的思索之后,在每一次深深的解剖自己之后,慢慢地,知道了自己真正想要的东西;逐渐地,找到了实现它们的途径。能够意识到这些并将其转化为行动,对我而言,已经是莫大的欣喜。

是的,我想我已经很清楚地表明了自己的坚持与态度,其实很简单。

在这条路上,难免会有对于名和利的追逐。但是,我觉得这里要把握好一个尺度。要在行业里、人群中有发言权,需要有标签和成就,需要有让人们信服的东西。但如果痴迷于这些,无异于修炼武林秘籍时走火入魔。所以我会左右权衡,然后做取舍。当然,我也会犯错,甚至双眼也会被诱惑。但这是我选择的路,这些挑战,我就都会接受。

说回工作,其实相对来说,我在广州研究院的工作更加轻松。虽然也在做性能优化,但是一部分业务变成了三方App分析。这部分工作相对容易一些,所以总体来说更加轻松了。

于是乎,不只是博客园。在闲暇时,我开设了知乎专栏和微信订阅号。那个时候的订阅号还叫做“App开发经验谈”。刚开始是把之前写过的文章搬运过来,后来就是新创作的内容多平台同步发,像现在这样。后来还在GitChat上面举行收费Chat,主要是写Flutter技术方面,评价一直是五颗星满星。

再到后来,就有编辑邀请我写一本Flutter相关的书。那个时候Flutter刚刚发布没多久,版本号还没过1.5。在技术圈属于“新兴”的玩意,再加上其描绘的跨平台开发蓝图,吸引了不少开发者。

一开始,我觉得自己一直是读者,技术水平远远达不到写书的高度,就婉拒了那位编辑。后来没过多久,大概也就一周或者两周的时间,就又有一位编辑来找到我,问我有没有写书的意向。

能收到这样的邀请,固然是件开心事。但如果真的要写,就是一份责任。

我回到当时租的房子,和老婆商量这件事。我把我的担心跟她讲了,她劝我试一下,人生总要有第一次。看到老婆这么支持和鼓励我,我最终鼓起勇气开始写作。

由于是我一个人写,再加上不是全职,速度固然比较慢。从3月12日开始规划目录结构,到8月9日完成全部初稿,总共用了5个月。说来也巧,写作这本书的开端是在3月12日,恰好是植树节。写作这本书,就像是种下了树苗。从此之后,我的写作不再是单纯的免费分享,而是终于开始走向盈利了。虽然到今天为止,这棵小树还没长成参天大树,甚至长出了一些不该有的树杈,但它终归是会成长,是会长大的,也终将变成一棵参天大树。

在写作这本书时,我还在书中藏了一些彩蛋。比如相声里的“报菜名”、同事的昵称、老婆的昵称等等。后来这些彩蛋被完整地保留了下载,如果感兴趣的话,可以搜索《Flutter从0基础到App上线》。但是,我不建议大家买来读了,毕竟是几年前的书,技术的更迭已经使这本书变得没什么时效性了。

毕竟是第一次写书,这次合作虽然最后以成功达成告终,但稿酬是按量计算的,而非销量。也就是说,交付、校对、修改、终版稿件后,只有一笔稿酬。无论这本书日后销售情况如何,收益也和我没什么关系了。万一我写出来一本爆款,岂不亏大了?

后来也是一次巧合,清华社的编辑联系到我,看我一直做Android性能优化,问我有没有这方面的意向。那个时候的我有了第一本书的成功,对后续的写作可以说是信心满满,甚至很期待再有一次。不过这次我变聪明了,先确定稿酬支付的方式,再继续往下谈。

第二本书,题目是《打造流畅的Android App》。这本书是面向有一定基础的Android开发者的,讲的内容其实就是我的工作总结,结果销量一般。不过这本书还带来了一个神奇的效应,就是到后来我面试的时候,面试官是拿着这本书进来的,结果自然是技术也没面什么内容,这个收益倒是我之前完全没有预料到的。

如此经历,让我明白:“正确的事,要重复做”。对,又是一个简单到不能再简单的道理。

随着工作年限的增长,我发觉很多类似这样简单的道理,反倒被很多人遗忘了。这就像极了我们买了很多书,或者收藏夹里装满了“干货”,却从没有看过一样。其实,正确的做法根本不是贪多,而是做好,哪怕只是很简单,很容易的小事情。正所谓:“勿以善小而不为”。而且作为程序员,应该很了解问题拆解是咋回事。道理都是一样的:一点一滴地做,汇总起来,就是个宏伟的目标。

除了这类盈利的写作,我的博文很荣幸地被谷歌开发者官方微信公众号转载了。我也收到了平生第一件来自技术社区的纪念品:好像是一件Google的T恤,还有Flutter的贴纸啥的。后来收到的越来越多,我就数不过来,也记不清了。

随着这些成就逐渐达成,博客便慢慢地被我疏远了,公众号也停更了,实在是忙不过来,顾不得它们了。毕竟我有了家庭,总不能回到家还像上班那样吧。

不知不觉,2019年就来到末尾了。

哦,对了,还有件大事。就是广州三星研究院,我所在的部门解体了。于是,我们便决定回天津生活。这是2019年年底发生的事,当然,真正离开是在2020年的春节期间。对,就是那个疫情刚开始大爆发的时候。也正是这样,我的司龄加了0.5,拿到了更多的赔偿金。

说起来,对三星这家公司还是挺感恩。首先是出差的机会,让我不再是单身;然后就是去广州工作生活,不用担心异地的问题;最后就是两次补偿金。这种体验,相信不是大部分都体验过的。当然,会有人觉得很动荡。但我觉得每一步都踩在了正确的节奏上,对于我来说,挺好的。

从前两年开始,每年年末,我都会看罗振宇的跨年演讲。2019年年末,终于有人陪我一起看了。

回顾那一年的跨年演讲内容,给我感触最深的就是灵魂五连问:“你是谁?你干啥?你为谁干?别人需要你吗?社会更好了么”?没错,这是值得每一个忙碌的人、每一个迷茫的人思考的问题。如果一个人,不再被需要,不再对这个社会、这个世界有所贡献,那这个人就已经死了。

抱着这样的态度,我们一起跨入了2020,那个去哪儿都要戴着口罩的一年。

有关我的十年编程路 2019年篇的更多相关文章

  1. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  2. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. ruby-on-rails - 测试我的 Ruby gem:Shoulda::Matchers:Module (NoMethodError) 的未定义方法 `configure' - 2

    我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a

  6. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

  9. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  10. ruby-on-rails - 为什么用户必须输入 7 位数的 Twitter PIN 才能授予我的应用程序访问权限? - 2

    我正在为我的用户实现一些ruby​​onrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需

随机推荐