Home
Chirpy
Cancel

You Can't Write Perfect Software

完美的软件不存在,在计算机简短的历史中,没有一个人曾经写出过一个完美的软件。你也不大可能成为第一个。 除非你把这作为事实接受下来,否则你最终会把时间和精力浪费在追逐不可能实现的梦想上。 那么,给定了这个让人压抑的现实,注重实效的程序员怎样把它转变为有利条件? 众所周知,上路的司机只有两种,一种是开得比我慢的SB,另一种是开得比较我快的SB。于是,我们需要防御性地开车,做好预判。 编程与...

一点想法

三体所说的一点没错,这个世界很多时候就是一片黑暗森林。弱肉强食的丛林原则依然是主旋律。 脱离现实,乌托邦式地追求理念看起来很美,但实际上可能和大批香港人一样,只是欠缺思考和见识,做出的 young/simple/naive(长者恨铁不成钢但对牛弹琴了) 决定而已。 如果把成功的标准定为成功占领一定的市场份额,那么我们很容易得出一个结论:工程优秀,并不是一个项目成功的必要条件。 因为鹅...

7 Pro-tips for Room

7 Pro-tips for Room 预填数据:如果需要在数据库填充默认数据,可在 RoomDatabase#Callback 的 onCreate 或 onOpen 中执行。onCreate 仅在创建DB的第一次执行,onOpen 则是每次打开都会执行。 Room.databaseBuilder(context.applicationContext, Data...

当 WorkManager 遇见 Kotlin

当 WorkManager 遇见 Kotlin 这是第三篇关于 WorkManager 的文章。 WorkManager 是 Android Jetpack 中的一个异步处理库,是当前 Android 中处理后台任务的最佳实践。 以下为前两篇: What WorkManager is and when to use WorkManager How to use the Wor...

AndroidX: WorkManager 官方文档阅读笔记

通过 WorkManager ,你指定执行的约束条件,然后可以放手把任务交给系统来执行。如果需要确认 WorkManager 是否你要的解决方案,可以详阅 background processing guide. 使用入门 Worker 和 AsyncTask 的 API 设计极像: class UploadWorker(context:Context, params: Workerp...

记录一次 bug .

今天遇到一个很让人抓狂的问题,一直提示 type '(int, int) => Null' is not a subtype of type '(dynamic, dynamic) => void' 源码如下: import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; ...

2019 年年中小结

Too young. Too simple. Sometimes naive. 忠言逆耳利于行。 2019 年,是个刷新三观的一年。

Customize the Favicon

The favicons of Chirpy are placed in the directory assets/img/favicons/. You may want to replace them with your own. The following sections will guide you to create and replace the default favicons...

Writing a New Post

This tutorial will guide you how to write a post in the Chirpy template, and it’s worth reading even if you’ve used Jekyll before, as many features require specific variables to be set. Naming and...

学习笔记:《The Art of Readable Code》(2) : Names That Can’t Be Misconstrued

2. 不会被误解的命名 上一章中,我们讨论了如何把信息包装到命名中,而这一章,我们将聚集于另一个话题:关注那些容易被误解的命名。 关键:问下自己“这个命名会不会被别人理解成其他意思” 例: val result = Database.all_objects.filter("year <= 2011") 上例很难通过名字判断是要过滤掉符合条件的,还是保留符合条件的对象...