{"id":22092,"date":"2016-03-29T11:39:00","date_gmt":"2016-03-29T16:39:00","guid":{"rendered":"https:\/\/blog.planview.com\/?p=22092"},"modified":"2023-02-08T11:44:09","modified_gmt":"2023-02-08T17:44:09","slug":"learning-new-things","status":"publish","type":"post","link":"https:\/\/blog.planview.com\/learning-new-things\/","title":{"rendered":"Learning New Things"},"content":{"rendered":"\n<div class=\"entry-content clearfix\">\n\n\t\t<p>It\u2019s mid-2015. Our product and platform had evolved from a pure Java application to a mixed-technology web-based solution, and I found myself realizing that I had to up my game. I\u2019d built many web applications before. But my drive to hone my skills was coming from the company\u2019s need to move ahead with a faster, better, more modern product development approach using technologies that were somewhat new to me: npm, Bower, AngularJS, Grunt, Karma, Jasmine\u2026 there was a good-sized list of them.<\/p>\n<p>As a software engineer I\u2019ve always believed that it\u2019s my responsibility to contribute powerfully to the team\u2019s delivery. By that I mean that I should be able to tackle any problem with confidence, knowing that the solution would flow from my keyboard as fast as I could think it up. That was definitely not happening with this web stack, so it was time to do something about it. I\u2019m a big fan of learning by doing, so I decided to take it on by creating a small application to exercise my weaknesses using the very technology stack that made me uncomfortable.<\/p>\n<p>Fast-forward to 2016. Having spent many evenings and weekends buffing up my skills, it\u2019s been over 9 months now since I\u2019ve had any misgivings about my ability to deliver and it feels great! In the process I\u2019ve created <a href=\"https:\/\/github.com\/greensopinion\/greenbeans\">a personal finance application<\/a> using Java and AngularJS.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"media-image attr__typeof__foaf:Image img__fid__5541 img__view_mode__media_large\" style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"https:\/\/blog.tasktop.com\/sites\/default\/files\/styles\/large\/public\/greenbeans-report.png?itok=2JPqwgac\" alt=\"\" width=\"480\" height=\"383\"><\/p>\n<p>I\u2019ve open-sourced my finance application not only because I find it useful, but because it\u2019s a great showcase of an architecture and many of the techniques and technologies of Tasktop\u2019s integration platform. Feel free to take a look \u2013 you\u2019ll get a sense as to the technology stack that we use at Tasktop, and what it might be like to work with our platform codebase (<a href=\"https:\/\/blog.tasktop.com\/careers\">we\u2019re hiring!<\/a>).<\/p>\n<p>Things to look out for include the testing approach, and how to write testable software. Take a look at how dependency injection, Guice, JUnit and Mockito can be used to test units of code while minimizing dependencies. See how the the JavaScript and UI components can be tested independently of the back end by mocking up web services.<\/p>\n<p>The client-side architecture looks something like this:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"media-image attr__typeof__foaf:Image img__fid__5551 img__view_mode__media_large\" style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"https:\/\/blog.tasktop.com\/sites\/default\/files\/styles\/large\/public\/greenbeans-client-side-architecture.png?itok=hOc9i8R_\" alt=\"\" width=\"480\" height=\"261\"><\/p>\n<p>The somewhat typical AngularJS stack includes bootstrap, sass, font-awesome and chart.js. Testing dependencies include jasmine, karma and phantomjs, built with npm, Grunt and Bower.<\/p>\n<p>The server-side architecture looks something like this:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"media-image attr__typeof__foaf:Image img__fid__5536 img__view_mode__media_large\" style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"https:\/\/blog.tasktop.com\/sites\/default\/files\/styles\/large\/public\/greenbeans-server-architecture.png?itok=MFzzqy6H\" alt=\"\" width=\"480\" height=\"179\"><\/p>\n<p>Unlike the Tasktop platform, which is a proper server-side web application, this is a desktop application. There\u2019s a somewhat novel approach to hosting this all inside of a single JavaFX process with a WebView while still using web services:<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"media-image attr__typeof__foaf:Image img__fid__5546 img__view_mode__media_large\" style=\"display: block; margin-left: auto; margin-right: auto;\" src=\"https:\/\/blog.tasktop.com\/sites\/default\/files\/styles\/large\/public\/greenbeans-javascript-bridge.png?itok=9O9wdZU3\" alt=\"\" width=\"480\" height=\"233\"><\/p>\n<p><span style=\"line-height: 29.0001px;\">&nbsp;<\/span><\/p>\n<p>To make this work, the JAX-RS services are actually just bridged to the JavaScript application in-memory \u2013 no networking needed!<\/p>\n<p>This approach enables coding of a \u201cnormal\u201d AngularJS application using standard JAX-RS REST services, but as a desktop application. This has the benefit of leveraging a solid modern web architecture with good separation of concerns, with great web technologies for UI development.<\/p>\n<p>I hope that you <a href=\"https:\/\/github.com\/greensopinion\/greenbeans\">enjoy having a look at the souce<\/a>. If you find it interesting and if you\u2019re inspired by Tasktop\u2019s mission to connect the world of software delivery, please <a href=\"https:\/\/blog.tasktop.com\/careers\">check out our openings \u2013 we are hiring!<\/a><\/p>\n\n\t\t\n\t<\/div>\n","protected":false},"excerpt":{"rendered":"<p>It\u2019s mid-2015. Our product and platform had evolved from a pure Java application to a mixed-technology web-based solution, and I found myself realizing that I had to up my game. I\u2019d built many web applications before. But my drive to hone my skills was coming from the company\u2019s need to move ahead with a faster,&#8230;<\/p>\n","protected":false},"author":233,"featured_media":22093,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","footnotes":""},"categories":[9548],"tags":[],"class_list":["post-22092","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering-teams"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v26.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Learning New Things - Planview Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.planview.com\/learning-new-things\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Learning New Things\" \/>\n<meta property=\"og:description\" content=\"It\u2019s mid-2015. Our product and platform had evolved from a pure Java application to a mixed-technology web-based solution, and I found myself realizing that I had to up my game. I\u2019d built many web applications before. But my drive to hone my skills was coming from the company\u2019s need to move ahead with a faster,...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.planview.com\/learning-new-things\/\" \/>\n<meta property=\"og:site_name\" content=\"Planview Blog\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/pages\/Planview-Inc\/89422974772\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-29T16:39:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-08T17:44:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png\" \/>\n\t<meta property=\"og:image:width\" content=\"917\" \/>\n\t<meta property=\"og:image:height\" content=\"179\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tasktop Blogger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Planview\" \/>\n<meta name=\"twitter:site\" content=\"@Planview\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tasktop Blogger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/\"},\"author\":{\"name\":\"Tasktop Blogger\",\"@id\":\"https:\/\/blog.planview.com\/#\/schema\/person\/35676ea677995199889c0b6456156ce2\"},\"headline\":\"Learning New Things\",\"datePublished\":\"2016-03-29T16:39:00+00:00\",\"dateModified\":\"2023-02-08T17:44:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/\"},\"wordCount\":550,\"publisher\":{\"@id\":\"https:\/\/blog.planview.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png\",\"articleSection\":[\"Engineering Teams\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/\",\"url\":\"https:\/\/blog.planview.com\/learning-new-things\/\",\"name\":\"Learning New Things - Planview Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.planview.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png\",\"datePublished\":\"2016-03-29T16:39:00+00:00\",\"dateModified\":\"2023-02-08T17:44:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.planview.com\/learning-new-things\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage\",\"url\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png\",\"contentUrl\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png\",\"width\":917,\"height\":179},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.planview.com\/learning-new-things\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.planview.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Learning New Things\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.planview.com\/#website\",\"url\":\"https:\/\/blog.planview.com\/\",\"name\":\"Planview Blog\",\"description\":\"Leading the conversation on digital connected work\",\"publisher\":{\"@id\":\"https:\/\/blog.planview.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.planview.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.planview.com\/#organization\",\"name\":\"Planview\",\"url\":\"https:\/\/blog.planview.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.planview.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2015\/06\/planview-logo-black.png\",\"contentUrl\":\"https:\/\/blog.planview.com\/wp-content\/uploads\/2015\/06\/planview-logo-black.png\",\"width\":280,\"height\":66,\"caption\":\"Planview\"},\"image\":{\"@id\":\"https:\/\/blog.planview.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"http:\/\/www.facebook.com\/pages\/Planview-Inc\/89422974772\",\"https:\/\/x.com\/Planview\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.planview.com\/#\/schema\/person\/35676ea677995199889c0b6456156ce2\",\"name\":\"Tasktop Blogger\",\"url\":\"https:\/\/blog.planview.com\/author\/tasktop-blogger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Learning New Things - Planview Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.planview.com\/learning-new-things\/","og_locale":"en_US","og_type":"article","og_title":"Learning New Things","og_description":"It\u2019s mid-2015. Our product and platform had evolved from a pure Java application to a mixed-technology web-based solution, and I found myself realizing that I had to up my game. I\u2019d built many web applications before. But my drive to hone my skills was coming from the company\u2019s need to move ahead with a faster,...","og_url":"https:\/\/blog.planview.com\/learning-new-things\/","og_site_name":"Planview Blog","article_publisher":"http:\/\/www.facebook.com\/pages\/Planview-Inc\/89422974772","article_published_time":"2016-03-29T16:39:00+00:00","article_modified_time":"2023-02-08T17:44:09+00:00","og_image":[{"width":917,"height":179,"url":"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png","type":"image\/png"}],"author":"Tasktop Blogger","twitter_card":"summary_large_image","twitter_creator":"@Planview","twitter_site":"@Planview","twitter_misc":{"Written by":"Tasktop Blogger","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.planview.com\/learning-new-things\/#article","isPartOf":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/"},"author":{"name":"Tasktop Blogger","@id":"https:\/\/blog.planview.com\/#\/schema\/person\/35676ea677995199889c0b6456156ce2"},"headline":"Learning New Things","datePublished":"2016-03-29T16:39:00+00:00","dateModified":"2023-02-08T17:44:09+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/"},"wordCount":550,"publisher":{"@id":"https:\/\/blog.planview.com\/#organization"},"image":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png","articleSection":["Engineering Teams"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/blog.planview.com\/learning-new-things\/","url":"https:\/\/blog.planview.com\/learning-new-things\/","name":"Learning New Things - Planview Blog","isPartOf":{"@id":"https:\/\/blog.planview.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage"},"image":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png","datePublished":"2016-03-29T16:39:00+00:00","dateModified":"2023-02-08T17:44:09+00:00","breadcrumb":{"@id":"https:\/\/blog.planview.com\/learning-new-things\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.planview.com\/learning-new-things\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.planview.com\/learning-new-things\/#primaryimage","url":"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png","contentUrl":"https:\/\/blog.planview.com\/wp-content\/uploads\/2023\/02\/learning-new-things.png","width":917,"height":179},{"@type":"BreadcrumbList","@id":"https:\/\/blog.planview.com\/learning-new-things\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.planview.com\/"},{"@type":"ListItem","position":2,"name":"Learning New Things"}]},{"@type":"WebSite","@id":"https:\/\/blog.planview.com\/#website","url":"https:\/\/blog.planview.com\/","name":"Planview Blog","description":"Leading the conversation on digital connected work","publisher":{"@id":"https:\/\/blog.planview.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.planview.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/blog.planview.com\/#organization","name":"Planview","url":"https:\/\/blog.planview.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.planview.com\/#\/schema\/logo\/image\/","url":"https:\/\/blog.planview.com\/wp-content\/uploads\/2015\/06\/planview-logo-black.png","contentUrl":"https:\/\/blog.planview.com\/wp-content\/uploads\/2015\/06\/planview-logo-black.png","width":280,"height":66,"caption":"Planview"},"image":{"@id":"https:\/\/blog.planview.com\/#\/schema\/logo\/image\/"},"sameAs":["http:\/\/www.facebook.com\/pages\/Planview-Inc\/89422974772","https:\/\/x.com\/Planview"]},{"@type":"Person","@id":"https:\/\/blog.planview.com\/#\/schema\/person\/35676ea677995199889c0b6456156ce2","name":"Tasktop Blogger","url":"https:\/\/blog.planview.com\/author\/tasktop-blogger\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/posts\/22092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/users\/233"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/comments?post=22092"}],"version-history":[{"count":0,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/posts\/22092\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/media\/22093"}],"wp:attachment":[{"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/media?parent=22092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/categories?post=22092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.planview.com\/wp-json\/wp\/v2\/tags?post=22092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}