IngramChen 積分 0

對了,還有 Path 2.0 也是,那轉轉轉的 Floating Action Button 當時也是讓人眼睛一亮

IngramChen 積分 0

motion design 的最大反例就是 Facebook Paper

Paper 剛出來時自然是驚為天人,那新奇順暢的新 UI 體驗啊。

結果最後 Paper 失敗了。

優秀的產品不能沒有好 UI,但好 UI 救不了無用的產品…

IngramChen 積分 3

作者大概覺得每項投資都不能失敗吧?

失敗個幾十次、只成功一回,才是家常便飯…

Google 這類的大公司面臨的最大問題就是保守。他們如果因為廣告賺翻了,然後死抱著這核心業務,不去嘗試一些新的領域,沒幾年就會完蛋了 (看向 Yahoo...)

Google 你就繼續投資那些別人會覺得是白吃亂燒錢的 未來 吧,別理這些小鼻小眼的短視客。

IngramChen 積分 6 編輯於

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 設定。

IngramChen 積分 0

我終於知道要怎麼跟別人談論這個概念了…

就 motion design 這個專有名詞

中文不曉得有沒有正式的翻譯

IngramChen 積分 0

method 的顏色壞掉了,害我要改回來

IngramChen 積分 2

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 太慢。

IngramChen 積分 2 編輯於
  • dropbox 新的 storage server 自己營運,全搬出 AWS
  • 新的 Magic Pocket 一部份是 golang,一部份是 rust
  • dropbox 的 backend 滿滿的 golang,rust 才剛導入
  • dropbox 的 web 端是百萬行級的 python
  • dropbox 也有一堆 c/c++,散佈在 server 和 mobile client

rust 開始進大公司 production 了啊

IngramChen 積分 3

這一篇在 hacker news 和 reddit programming 的討論完全成對比

reddit 的人吐槽這傢伙是 iPhone indie,不用開會、不用計畫、不用開 issue... blah blah 的,當然可以每天工作三小時啊!

hacker news 的人則多半同意…

IngramChen 積分 2

我以前好像是學三個月 (假日班) 吧?是資策會開的 J2EE 課什麼的 (十幾年前…)。忘了多少錢,好像是七、八萬?不過這也不是開給完全不會寫的人…

我那個時代挺流行去上幾個月的程式課 (不是週末,是全天),然後繳個十幾萬,課程的最後都會合作一個專案出來。如果不是這樣訓練素人的話,真的無法當作戰力吧。

IngramChen 積分 0 編輯於

一個月 (只有週末) 要教完全不會寫程式的人,變成可上戰場的工程師,這是不可能的任務吧…

IngramChen 積分 0 編輯於

drawer 本來就不是拿來做瀏覽 (navigation) 的。

drawer 裡放的大多都是一些工具、設定、help… 等等 (不然何必藏起來?)。當然 drawer 也可以導到其他頁啦,但那些頁應該都是極少用到,沒地方可放才會放到 drawer 裡。

你就想現實生活中抽屜是拿來幹嘛的?抽屜是收藏、放東西的地方啊!抽屜不是拿來瀏覽、引導的吧!

還有左右兩邊都放 drawer 是很酷,但其實用戶常常忘記有另一邊可用,而且還會搞不清楚從屬關係 (誰是誰的上層?),所以沒特別的需求的話還是只做一邊比較好懂。

IngramChen 積分 0
import lombok.val;

val foo = new ArrayList<>();

我看了一下 lombok 的 val 是長這樣,實在有點無言… ,這寫法到了 java9 通通都要改了吧

話說 lombok 對 Java 實在是改太多了,改成這副德性我會直接選 kotlin 了。 (當然 lombok 出時 kotlin 也沒個影啦,但現在已經有選擇了)

IngramChen 積分 0

因為 這次是個 reboot 的機會,所以會想要一次到位把它搞定吧。參照別的語言 val/var/let 都用的很爽,我想 Java 也可以選擇比較簡潔的寫法。

我猜最後定案時大概是 val/var。哈

IngramChen 積分 0

上個世紀擔任這角色的是 xml,現在變 json…

IngramChen 積分 0

Android 走向 Java 8,而且還開發了專用的 jack and jill compiler,所以 Android 的路線很清楚了,未來不會像 iOS 一樣會有一個新一代的語言。

kotlin 哭哭

IngramChen 積分 0

所以如果不是很有必要,就不要用 async 開發。我是覺得只有 android 有必要用 async 開發,server 其實只有少部份需要這樣寫。

IngramChen 積分 0

在 Dart 裡,也是有 var 的用法 (跟 js 一樣),也是到處都能寫。

不過 Dart 經過二年成熟後,他們最後的 code style 建議,你只該在 local 變數上使用 var,其他 instance field, method parameter 上都不該用。

Java 則是直接限制 var 只能在 local 變數上使用,這算是第一步就走對了,省得有人到處亂寫,影響程式可讀性。

IngramChen 積分 0

我覺得 final 比較好,因為在 java 裡比較好認。

  var barList = new ArrayList<String>();
  final fooList = new ArrayList<String>();

var/val 雖然有很多優點,短,而且一樣長,但這兩個字實在太像了,可讀性有點差。當然可以靠 IDE 上不同色來解決啦…

IngramChen 積分 0 編輯於

這個喔,var 在 java 不是 keyword,所以如果有人很無聊在 java 8 之前這樣寫程式:

class Container<var> {
  void add(var x) {
    var y = x;
  }
}

然後到 java 9 裡就 compile error 了吧

IngramChen 積分 0

我看 blog 有寫說有 Stream 可用,但它的文件卻沒有明白指出,到底是… ?

IngramChen 積分 1

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 邏輯而已,卻要寫成這副德性…