Just a quick glance of the progress of my projects this year, roughly based on my GitHub history. You can find details at https://github.com/jiyinyiyong , I'm going to explain only the big moments in this post.


A majority of my commits were pushed to two components I created for my presious company.

  • https://github.com/jianliaoim/react-lite-uploader One of them is file uploader which wrappes fileapi, which is mainly event handlers that does not bother React's pure rendering princeples.
  • https://github.com/jianliaoim/react-stack-modal/ The other one is a piled modal. I wrote about if before. I realized there are two kind of different modal, one is global are reusabe, the other is private and relying on data from a local parent component. This component is the global specifically.



In Feb, I handed my tasks over to my workmates and got quite some time to update Cirru Editor. At that time Cirru Editor is something you edit with DOM but generates .cirru files.

The work on Light Editor actually last weeks and I was still coding it in the followed month.


I started my rest in the 11th. So I got quite a lot time to maintain my personal projects. I started building Respo in the beginning of the month. Since I'm not working for anybody, so I can use ClojureScript for all my stuffs.


Respo is huge work, I was also spending time on it in April. I made more tiny apps, fixed bugs, optimized performance. It was somehow happy journey the first time I can create apps with my own library, and without something like React. Then I started thinking about Quamolit, an old idea for Canvas.

  • https://github.com/Quamolit/quamolit So React is programming DOM declaratively. I want something for animations too, i.e. declarative code for animations. A lot ideas was reused from Respo. The library is slow. But finally I made it painting animations.
  • https://github.com/mvc-works/boot-workflow I collected my tools around Boot and put them in a project called Boot Workflow, as a boileplate.

Actually Quamolit comes with a bunch of examples. Each of them took me one or two days plus the time I debugged and fixed bugs.


Before returning to work, I was working on Quamolit. I wanted to prove that Quamolit is useful. So I created 2 examples with it. Then I went to work. It is a large company writing ES6, took me long time to get used to it again.

https://github.com/Quamolit/blossom-scores Just a minimal game in Quamolit that I can touch the points to pick numbers. I want demonstrating the animations. I got the idea in 2012 but only know CSS at that time. Now I built it in real. https://github.com/Quamolit/2048 This 2048 game is in Canvas with animations. I proved Quamolit is somehow working. https://github.com/Cumulo/shallow-diff Shallow Diff is actually immutable-diff and immutable-patch in ClojureScript, and simplified. https://github.com/Cumulo/cumulo-server The reason I need immutable diff is I want to do JSON/EDN diffing on a server, then patching on browser. My scripts was in CoffeeScript and now I made it ClojureScript. https://github.com/mvc-works/webpack-hud Since in my work people use Webpack rather than boot-reload, I felt inconvenent so I made wepack-hud to create a figwheel-like error message. Also a simple one.


This month I spent most of my time maintaining my previous projects. Respo, Cirru, Boot Workflow, Quamolit, etc. This was the third week in the company. To me it was really new environment. I spent quite some time exploring React Native, but shortly ended it.

Respo was very slow at first, especially on mobile browsers. By reading the commit history I can recall that I spent a lot time trying to optimize it. As a former CoffeeScript programmer, I didn't know the difference between a vector and a list. I tried to replace slow seqs with vectors, still felt confused. But it became better when implemented caching. I realized ClojureScript is slow for some reasons.


I felt a bit more stable now with my work. Also I got some spare time to rethink my own projects. I have to say a lot of my code are wrote during work, so no longer productive as the beginning of the year. But I did got some ideas.

  • https://github.com/tiye/tiye.me After all, I need to update my home page to update the information on jobs. Actually I started a refactoring, but gave up when I felt bored.
  • https://github.com/Cirru/vectors-format I made some attempt to Cirru with a new IR format, but turned out to be useless after weeks.
  • https://github.com/Cirru/clouditor One day I got a really interesting idea that I need to use a "Chrome DevTools > Sources" like UI for programming. I mean, I need that call stack. With a call stack I could easily navigate among the functions that were related to my bug. I was amazed and built an prototype for it. I was inspired at that time.


The main topic of the month was Stack Editor. I wrote quite some code. Thank god my work was not that heavy. It costs lots of time to think about the details of Stack Editor. I paused for a long while even with Clouditor since I don't know how to make it real.

In the past month before Stack Editor, I was writing ClojureScript with Light Editor, which generates Clojure from EDN files that's edited as DOM. Now I can use Stack Editor instead with some "goto definition" like features. I love such feelings.


I remmembered I had a bad time in the Autumn but not in details. I ranted another room and moved. There was some pain. Anyway I was still maintaining Respo and Cirru since they are my daily concerns.

  • https://github.com/Respo/respo.site Also I created this site to document Respo APIs and examples. I really hope people read it and say ClojureScript is great, JavaScript is bad, React should use ClojureScript. Nobody said that to me. Now hear on Twitter that Reason is great, JavaScript, en... Well.


Got stabilized in Oct. A 7-day vacation in China you may know. And it's was the first time I went to a beach on a island. Not bad for a person low-spirited. I looked into Respo again and realized seq is not slow, just lazy that made Chrome DevTools think it's slow. A list is fast when reading from the head. So I deprecated the use of vectors. Also I made a change to the DOM diffing algorithms and it's significantly improved. Still now comparable to modern frameworks though.

  • https://github.com/Respo/respo-router I wrote a router for React before so I rebuilt it in Respo. Interestingly I found I can make a router recusive, yeah, recursive. I experimented, it worked. So I went back and refactored the CoffeeScript one.
  • https://github.com/Respo/shell-pages I was asked to look into Vue's isomorphic rendering so I did. Actually I was familiar with React, respo.site itself is isormorphic. This time I did it in Respo.
  • https://github.com/coffee-js/vue-coffee-workflow Oh, I have to go back on the right track of Vue. Vue 2 supported virtual DOM now, but compiling Babel is hard work, I preferred to use write in CoffeeScript by hand. Not big deal. After that, I translated the whole project into Babel code with a bunch of compilers.
  • https://github.com/Respo/global-popup And a modal component for Respo too, just like stack-modal mention above.

Plus I reduce the amount of painting step of Quamolit, it takes less memory now. Meanwhile I learnt that allocating in ClojureScript costs a lot. I should learn it earlier.


From my commits I see more code for my work, ES6. I got some cough. Also I need to prepare for a speech in mid-December. I forced myself to travel between Hangzhou and Shanghai, which reduced the time I wrote code. Luckily I got a important idea in this month which is Recollect.

https://github.com/Cumulo/recollect For Cumulo project there's a problem. It's too slow. Diffing for React is acceptable. But on the server, it's not. At least I need an caching algorithm to make small Cumulo apps not that slow. And Recollect was the solution. It's abstracting data into components that are cacheable. It's still eating memory, but anyway a bit better now. https://github.com/Respo/reel Reel is a time traveling debugger demo in Respo. I built one for React before. Now it was even simpler with ClojureScript which has persistent data by default. https://github.com/Respo/first-screen-demo And in my work time I use Respo to created a loading animation which React and Vue is not capable of. I was conceited. Anyway it's an interesting loading, isn't it?


Like mention I have a speech to give to I guess about a hundred people, to convince them that React has problems, ClojureScript will save it. Truth is Chinese programmers barely know Clojure. I'm still happy many of them are interested. I know there's ReasonML out there, they will probably not chooing ClojureScript. But they deserve to know the problems in "React.JavaScript".

In conclusion

It was huge work. I've been working on Cirru since 2012, and on Quamolit and Cumulo since the winter of 2014. It's really inspiring I can really make changes in those directions. And Respo is a surprise since learning ClojureScript. I felt lucky my boss did not give my pressure so I can write a lot of ClojureScript after work. It takes a lot of time to shift my mind to Clojure from JavaScript, but still I consider it worthwhile. Functional programming keeps me confident in programming that theories and skills leads to efficiency and creativeness, it's not as boring as writing glue code to fetch JSON and show/hide DOM elements. Mathematics shines.

It's also noticeable that all my big ideas occured before 2015. After that I only managed to realize and reinforce my old ones. As I'm getting old, I may become less artless and less creative. Can I go further, to make Stack Editor an effective code generator, to make Cumulo and Quamolit production ready? I'm not even sure. There's still a lot to ruminate and to think.

This was first year writing ClojureScript.

Write your comment…

I think you are very disciplined, also i liked a lot how you talk about your projects and what you have tried to do.

PD: ClojureScript sounds really interesting.

Happy 2017!