motion design 的最大反例就是 Facebook Paper
Paper 剛出來時自然是驚為天人,那新奇順暢的新 UI 體驗啊。
結果最後 Paper 失敗了。
優秀的產品不能沒有好 UI,但好 UI 救不了無用的產品…
作者大概覺得每項投資都不能失敗吧?
失敗個幾十次、只成功一回,才是家常便飯…
Google 這類的大公司面臨的最大問題就是保守。他們如果因為廣告賺翻了,然後死抱著這核心業務,不去嘗試一些新的領域,沒幾年就會完蛋了 (看向 Yahoo...)
Google 你就繼續投資那些別人會覺得是白吃亂燒錢的 未來
吧,別理這些小鼻小眼的短視客。
annotation 太多個或是太多層容易變得很難懂。
太多層是我對 spring boot 最困擾的部份
文中的例子像是 @DatabaseType
就是 meta annotation ,而它的上一層是 @Conditional(DatabaseTypeCondition.class)
,所以這是兩層的結構。
感覺上只有兩層還好?可是你看 auto configuration 上面掛的 annotation:
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration { ... }
總共掛了四個,value 有一共有五個參數,請問有哪些是單層的 annotation,哪些是雙層以上的 meta annotation ?
看到這種程式就頭暈了,很難 trace 啊。
spring 從 xml 轉到現在的 java based 的設定,很多都是靠 annotation,但老實說 annotation-based 設定其實一多起來並沒有比 xml 好懂,這種只能算是 annotation-based 的設定吧,算不上真正的 純 java
設定。
From HN:
- Dropbox 儲存量是 500 PB,AWS S3/Glacier 總量是 8EP,所以 Dropbox 原本佔了 AWS 6% 的空間
- 開發者選擇 rust over golang 的原因:memory和 cpu usage 等等。
所以說就算是 golang 用量已經很小了,他們還是覺得不夠好,本來這種專案一定是走 C 的,不過現在多了 rust 新選擇 -- 不會 null、不會 leak、不會 segfault、可以自己控制記憶體… 等等優點。
當然他們選新的平台 rust 是很危險的,不過他們常請 rust 開發者來一起討論,這樣的情況又是另一回事了 (除了矽谷的大公司大概沒人可以辦到這種事… )。他們對 rust 最大抱怨是 compile 太慢。
- dropbox 新的 storage server 自己營運,全搬出 AWS
- 新的 Magic Pocket 一部份是 golang,一部份是 rust
- dropbox 的 backend 滿滿的 golang,rust 才剛導入
- dropbox 的 web 端是百萬行級的 python
- dropbox 也有一堆 c/c++,散佈在 server 和 mobile client
rust 開始進大公司 production 了啊
這一篇在 hacker news 和 reddit programming 的討論完全成對比
reddit 的人吐槽這傢伙是 iPhone indie,不用開會、不用計畫、不用開 issue... blah blah 的,當然可以每天工作三小時啊!
hacker news 的人則多半同意…
我以前好像是學三個月 (假日班) 吧?是資策會開的 J2EE 課什麼的 (十幾年前…)。忘了多少錢,好像是七、八萬?不過這也不是開給完全不會寫的人…
我那個時代挺流行去上幾個月的程式課 (不是週末,是全天),然後繳個十幾萬,課程的最後都會合作一個專案出來。如果不是這樣訓練素人的話,真的無法當作戰力吧。
drawer 本來就不是拿來做瀏覽 (navigation) 的。
drawer 裡放的大多都是一些工具、設定、help… 等等 (不然何必藏起來?)。當然 drawer 也可以導到其他頁啦,但那些頁應該都是極少用到,沒地方可放才會放到 drawer 裡。
你就想現實生活中抽屜是拿來幹嘛的?抽屜是收藏、放東西的地方啊!抽屜不是拿來瀏覽、引導的吧!
還有左右兩邊都放 drawer 是很酷,但其實用戶常常忘記有另一邊可用,而且還會搞不清楚從屬關係 (誰是誰的上層?),所以沒特別的需求的話還是只做一邊比較好懂。
import lombok.val;
val foo = new ArrayList<>();
我看了一下 lombok 的 val 是長這樣,實在有點無言… ,這寫法到了 java9 通通都要改了吧
話說 lombok 對 Java 實在是改太多了,改成這副德性我會直接選 kotlin 了。 (當然 lombok 出時 kotlin 也沒個影啦,但現在已經有選擇了)
因為 這次是個 reboot 的機會,所以會想要一次到位把它搞定吧。參照別的語言 val/var/let 都用的很爽,我想 Java 也可以選擇比較簡潔的寫法。
我猜最後定案時大概是 val/var。哈
Android 走向 Java 8,而且還開發了專用的 jack and jill compiler,所以 Android 的路線很清楚了,未來不會像 iOS 一樣會有一個新一代的語言。
kotlin 哭哭
在 Dart 裡,也是有 var
的用法 (跟 js 一樣),也是到處都能寫。
不過 Dart 經過二年成熟後,他們最後的 code style 建議,你只該在 local 變數上使用 var
,其他 instance field, method parameter 上都不該用。
Java 則是直接限制 var
只能在 local 變數上使用,這算是第一步就走對了,省得有人到處亂寫,影響程式可讀性。
我覺得 final 比較好,因為在 java 裡比較好認。
var barList = new ArrayList<String>();
final fooList = new ArrayList<String>();
var/val 雖然有很多優點,短,而且一樣長,但這兩個字實在太像了,可讀性有點差。當然可以靠 IDE 上不同色來解決啦…
這個喔,var
在 java 不是 keyword,所以如果有人很無聊在 java 8 之前這樣寫程式:
class Container<var> {
void add(var x) {
var y = x;
}
}
然後到 java 9 裡就 compile error 了吧
play+akka+cassandra
不過它的 API 寫起來很奇怪,而且程式排起來也不會很清楚…
public interface HelloService extends Service {
ServiceCall<NotUsed, String, String> sayHello();
default Descriptor descriptor() {
return named("hello").with(
namedCall("hello", sayHello())
);
}
}
Generic parameter 用到三個… 可讀性已經變差了。
Java 8 Stream API 也是很多 generic parameter (多到四個),但是開發者使用 API 時卻藏得很好,程式碼很乾淨。
lagom 的 API 一時之間很難吃的下去,也許要用 scala 腦去思考?還有,因為 API 大多是 async 的緣故,程式碼也是開始堆了好幾層:
public <Id, Request, Response> ServerServiceCall<Id, Request, Response> authenticated(
Function<User, ServerServiceCall<Id, Request, Response>> serviceCall) {
return HeaderServiceCall.composeAsync(requestHeader -> {
// First lookup user
CompletionStage<Optional<User>> userLookup = requestHeader.principal()
.map(principal -> userStorage.lookupUser(principal.getName()))
.orElse(completedFuture(Optional.empty()));
// Then, if it exists, apply it to the service call
return userLookup.thenApply(maybeUser -> {
if (maybeUser.isPresent()) {
return serviceCall.apply(maybeUser.get());
} else {
throw new Forbidden("User must be authenticated to access this service call");
}
});
});
}
看這些程式碼,我實在吃不下去,上面只有三個 if 邏輯而已,卻要寫成這副德性…