Christian Heilmann

Author Archive

Interview with Goto Unscripted about the present and future of developer tools

Thursday, June 22nd, 2023

Chris Heilmann on stage with his hands in the air

Back in October 2022 I presented my work as a principal product manager of developer tools at GOTO Copenhagen and we also recorded a half hour interview. This is part of the GOTO unscripted series and Julian Wood talked to me about editors, debugging in context and what AI can do for developers. Here’s how they announced the video:

Are you tired of the traditional coding process of tedious debugging and manual coding? That’s where AI-powered IDEs come in. Christian Heilmann spoke to Julian Wood about why developers must break away from the traditional monolithic IDEs. He highlighted the importance of contextual tooling, where interfaces learn from user behavior and provide automated suggestions and simplified workflows. Hear this new #GOTOunscripted talk and learn to focus on writing rather than navigating complex environments.

You can watch the video on YouTube :

There is also a full transcript available at GOTOPedia .

Turning the screw with AI – ways for developer advocates to debunk the “AI can replace developers” myth

Wednesday, June 21st, 2023

A demonstration in the street with a protester having their hand raised

We are in times of turmoil in the tech world right now. On the one side, we have the AI hype in full swing. On the other, companies are heavily “healthsizing”. I just went through a round of job interviews as a prime candidate and wrote up why I didn’t take some jobs. It made me realise a few things.

Developers are worried

Things that developers worry about right now are if their jobs are safe or if they could be easily replaced by AI. They also worry about how to stay relevant as developers and not fall behind in a market that seems to churn out ground-breaking innovations by the hour. Furthermore, they worry how they should adjust their job expectations to not be part of the next round of mass layoffs.

Companies turn the screw and make developers feel that they are easily replaceable

All the big companies that developers want to work at right now flex their muscles trying to take away some of the freedoms and perks developers have been enjoying for a long time. To a degree, this is fine, as compared to other jobs we had a ridiculous amount of perks and freedoms. However, there are a few annoying things happening right now.

Companies in general implement an aggressive “back to office” policy which smacks of wanting to have more control over people rather than trusting their employees. Companies also cut costs at all cost. I’ve seen vital employees being laid off because they’ve been with the company for a long time and thus cost a lot.

Now, laying someone off in the US with a long track record isn’t that much of an issue. In Europe, however, the package you get for leaving and how many more months you get salary is connected to the amount you spent at the company. So, laying off a 10+ years employee is ridiculously expensive.

Generally, there seems to be a movement that companies try to see how far they can cut perks, salaries and benefits and yet still have top-notch employees. Often this goes hand in hand with a narrative that “AI is changing everything” and developers are not as needed as they used to be.

A quick reminder about Developer Advocacy

In my developer advocacy handbook, I defined a developer advocate as:

A spokesperson, mediator and translator between a company and its technical staff and outside developers.

So, if you are a developer advocate in a company, it is now the time to ramp up on first part – ensuring a good communication between the company and its developers. And – if need be – be their advocate in these cost-cutting negotiations.

This isn’t about the threat of AI

The argument that developers need to prove their worth to a company because of AI innovation is bogus. This isn’t about disruptive innovation. It is about ad sales plumeting and the stock market taking a punch. Companies are valued at profitability per head. So when profits go down – heads must roll.

Elon Musk with Twitter and others showed that you can act like a factory owner in the 1920s and people won’t complain and many people follow that example.

There’s also the problem that that we live in a general time of uncertainty and decline. And this is where populism thrives. The technology sector has been called by conservative and far-right spokespeople and politicians an “elite”. A job for only a chosen few, pampered millennials. So anything bad happening to the tech world is considered long overdue – we finally are also vulnerable. When the pandemic hit, the tech world was one of the few that still thrived as people needed to use the internet to communicate. When AI as a large new movement first came around, many people worried about their jobs. Now it is our turn to feel the same.

Some facts about AI and developer jobs

  • AI will take jobs
  • AI systems are a great way to make people more effective, thus saving the company money
  • Developers should be knowledgeable about AI
  • Most AI systems won’t be applicable to your company
  • AI means a big change to developer careers
  • Open LLMs are bad at teaching coding

Let’s go through them bit by bit and what developer advocates – or indeed anyone working in tech companies – should do about them.

AI will take jobs!

There is no doubt that some jobs will fall prey to AI now that it is much more readily available and computing power has caught up with its demands. The false narrative though is that it will replace specialist humans, experts and even highly creative jobs.

Generative AI is great at creating throwaway products. Quick prototypes, proof of concepts, an outline for an article that will need to get fact checked and re-written before publication.

This isn’t new. There has been an ongoing demand for predictable, throw-away products for quite a while that don’t really need to be done by a skilled developer or designer. In the past, these jobs could also be done with a content management system and a template. If we are honest with ourselves, even developers and designers have taken shortcuts for decades, re-using other people’s code, working with design libraries or putting together components we bought and customised.

The cool new thing tech companies try to sell is that we can create a web product by asking the right questions and an AI and it will give us designs, write copy for us and even create the code.

The first two results, writing generic copy and creating a “proven successful design” are worrying as they will result in thousands of look-alike products with no personal branding or character. This has been a worry of designers for quite a while now, but now we give people the illusion of being a director who can create by asking questions and refining them. The end products will still likely look like the same product with a different colour scheme and a different logo. Bootstrapping a product with a generic design and copy is a great way to get started, but it is not a way to build a brand.

Will this replace designers who know their job? Not really as there is a lot more to good design and writing than creating one interface. Will this replace writers? Not really, as a good writer works with the brand and the media limitations instead of churning out clever sounding copy.

The last part – that AI can also create all the code needed to build a web product – is a lie. Sure, you can generate code that creates this design with this copy and maybe add some basic interaction. But a real software product isn’t one design.

It aligns itself with the needs of the user, allows for customisation and people to change the look and feel to their needs. It also needs to know where the data in the interface comes from and what to do with user interaction regardless of input device. And – even more importantly – it should never make any assumptions about the text content of the product, as that will eventually come from a CMS anyways and have to support multiple languages.

This means though that products that don’t need to adhere to these quality standards or even legal compliance needs can and should be done with a “what you see is what you get” interface. And if people are happy to start with a human question to get there – all power to them.

This kind of AI is currently taking jobs that have been nothing but frustrating to designers and developers. We all have spent far too many hours building prototypes, slideware and demos for product shows that were eventually for the bin. And we had to deal with dozens of rounds of feedback that people want “this bigger” or “a nicer font”. If these people can now annoy an AI with this kind of demands – great.

If anything, this is a good opportunity to see where you apply developer and designer resources for products that will never be released anyway and redirect them to better causes. So here’s what we should do to deal with this threat:

  • Analyse what part of our company’s work could be automated with AI.
  • Provide coaching for teams to use these systems to create materials that can be augmented by the development team if needed.
  • Communicate with upper management that automating these things frees developer resources and provide work to be done by these teams – not replace them

Applying AI in context makes people more effective and saves the company money

Where AI systems can help is by making people more effective. This is where the “in context” part comes in. There are three areas where AI can help:

  • Machine Aided Code completion
  • Aiding Collaboration and Learning
  • Design to code conversion

Machine aided code completion are “AI code editors” that can help you write code. They are not new, but they are getting better. The idea is that you write a few lines of code and the editor will suggest the rest. This is not just about auto-completion, but about context recognition and style recognition. The big players are GitHub Copilot and Amazon CodeWhisperer. In addition to auto-completing your code, these tools can also explain code and have granular controls like “make this code more robust” or “generate tests for this function”. GitHub Copilot also offers a ChatBot interface that will run in the context of the currently open project, thus giving your developers the power of a chat client in their code editor. This also means that generated code is automatically validated.

The longer you use these tools, the more relevant the results get. I’ve been using Copilot since its beginning and whilst it offers me results I didn’t use before, it does mimic the way I write code. This means that it is not just a tool to save time, but also a tool to learn from. And that the generated code adheres to a standard that I use. This could be incredibly powerful in a team, where you could use an editor like this to enforce a coding standard and have the editor generate code that adheres to it without months of discussion.

Another interesting idea is Copilot for pull requests which is an autocompletion for pull requests. You tell it to write a summary and a step-by-step instruction and it takes the code in the pull request to create those. This saves a lot of time and ensures that your pull requests are always up-to-date. Having no readable or actionable pull requests is a big problem in many companies and this could be a great way to solve it.

There is already evidence that using a tool like this is great for efficiency of teams. The paper The Effect of AI-Assisted Code Completion on Software Development Productivity describes a study where a team of developers used a tool like this and were 40% more efficient than a team that didn’t.

On the design front, there are some interesting plugins for Figma and other design suites available. Locofy generates React and other framework components from your designs and helps with automated tagging of those. Deque’s Design tools give designers an idea what a certain component should be like in code and how to make them accessible.

It is up to you to find out how this could boost the efficiency of your teams:

  • Determine what tools your company could implement in-context and coach the teams how to use them.
  • Test out and validate systems out in the market.

Developers should know about AI

There is no doubt that developers should know about AI and get an in-depth look at how these “magical” systems work that can seemingly replace them. This means that companies should now ramp up on getting their employees to understand the workings and limitations of “AI”. Five years ago I wrote a course for Skillshare called Demystifying Artificial Intelligence: Understanding Machine Learning and whilst it is of course not up-to-date with current changes it still does a good job making people understand what “thinking machines” can do and where the limits, ethical issues and technical problems are.

The big players also understand that there is a need for engineers to know the inner workings of the big AI systems. DeepLearning.ai for example has a ChatGPT Prompt Engineering for Developers course that explains how to ask the right questions and Google has a full in-depth Generative AI learning path. Microsoft has a Quickstart Guide how to build a ChatBot for your own data.

The things we should be doing now are:

  • Collect up-to-date materials and courses and distribute them in the team
  • Negotiate with management to get a budget for official training on AI matters

Not all AI systems will work for your company

Whilst it is great to see all the things people do with AI, it is important to understand that not all of these systems will work for your company. Interestingly enough, even the big players like Google and Amazon warn internally about using chatbots as they are worried about data leaks and the systems being used for malicious purposes. So it seems there is a huge “Do as I say, not do as I do” going on here.

Companies need to question themselves if they can allow AI systems to index their codebase, if the internal setup and dependencies can even be accessed and if they are happy to have their codebase be used to train an AI system. Other questions are about usage and compliance. Can you use code without knowing its license or knowing where it came from? How does AI generated code fit into your review and compliance processes? How can you ensure code quality and security?

Steps we need to take now are:

  • Lead team members to review different tools and present them to the company followed by a discussion if the tools are applicable.
  • Assess and review different AI offerings and work with leads and upper management to see what can be applied.

Our careers as developers change

The biggest change we have to deal with right now is that if we get into a world where content generation via AI is the first step, that this affects our careers. We need to be aware that we are not the ones writing the code anymore, but we are the ones reviewing it. This traditionally is the job of a senior developer, but it is now the job of all developers. We need to change our career goals and expectations. The role of a junior developer becomes a lot smaller and people need to ramp up faster when it comes to their assessing and reviewing skills. And senior developers need to do more coaching and training of juniors to spot issues in generated code rather than writing code or doing reviews of hand-written code. In essence, we are merging two career levels into one. This could be a good thing, and it could save the company money in the long run.

To make this happen we need to:

  • Work with management and lead engineers to define a company strategy to make reviewing code a core skill.
  • Re-assess hierarchy and career goals and expectations accordingly.

Open LLMs are bad at teaching code

There are hundreds of demos and videos where people use ChatGPT to write code, build a web site or write a game. These are a great inspiration and I am all for people learning about code in a playful and engaging manner. The problem is that this doesn’t teach us how to program. It shows us how to use a tool to generate code. This is a huge difference. Granted, some tools also come with code explanations, but none of them tell you about shortcomings of the code. None of them tell you about security issues or how to make the code more performant. None of them tell you about the license of the code or if it is even legal to use it.

This is nothing new. Developers have been copying and pasting code they don’t understand from forums and tutorials for ages, changed some numbers around and when nothing blew up, submitted it to the project. This, however, was also an incredibly dangerous thing to do.

LLMs are great to make things sound like they are easy to do. They are good at making people feel like they are great developers. But great developers know why the code they write works, not just write code that works. Even worse, bad actors already use this as an opportunity to make developers use malicious and insecure code. There have been instances where ChatGPT generated code proposed packages that were misspelled or didn’t exist and when installed, they installed malware.

The way around that is to either set up your own ChatGPT like product or limit the sources your developers can use and immediately validate the generated code. GitHub CoPilot for docs is an interesting idea to give you a ChatGPT like interface but limit it to official documentation of certain projects.

One of my favourite things about it is that it allows you to customise the level of information you want the system to display. Thus it can be used to teach a junior developer the basics, as well as remind senior developers about syntax they may have forgotten.

Filtering options for GitHub Copilot for docs

If used inside your editing environment, this also means that code generated with these systems will automatically be checked for syntax errors and issues.

In order to use LLMs to teach internal developers, you need to:

  • Define and agree a “code hygiene” plan with the team for generated code.
  • Limit results of LLMs to validated sources and internal code repositories.
  • Work with management to use saved time to implement best practice trainings to learn how to validate generated code.

This is the time to fight for software development as a craft

These are some ways to counteract the “we don’t need developers, we have AI” argument whilst embracing these new ways of working in tech. I am sure there are many more and I’d love to hear your thoughts on this. Generally I think we now have the big task ahead of us to defend software development as a craft rather than a commodity. Sure, we can create a lot of stuff without any designer, writer or developer involved. But much like you can survive on microwave dishes, it is not the same as a home cooked meal.

New array methods in JavaScript bring immutability

Tuesday, June 6th, 2023

Scarlet Witch saying no more mutants

JavaScript now has a way to change elements, sort, reverse and splice arrays without changing the original, thus giving it immutability. Four new methods allow you to change arrays without having to create a copy first. The new methods are `with()`, `toSorted()`, `toReversed()` and `toSpliced()`. No need to create a copy with `[...arr]` first. Only missing support in terms of browsers is Firefox.

const arr = ['f','c','k','a','f','d'];
const newArr = arr.with(2,'m');
// newArr -> ['f', 'c', 'm', 'a', 'f', 'd']
const sortArr = arr.toSorted();
// sortArr -> ['a', 'c', 'd', 'f', 'f', 'k']
const reverseArr = arr.toReversed();
// reverseArr -> ['d', 'f', 'a', 'k', 'c', 'f']
const splicedArr = arr.toSpliced(3, 3, 'it');
// splicedArr -> ['f', 'c', 'k', 'it']

The many ways to select the n-th character from a string.

Friday, June 2nd, 2023

Many ways to do the same thing in JavaScript

A question I came across the other day during a JavaScript application test was this:

How would you select the n-th character from the word “Example”?

The fun thing here is that there are lots of different ways to do that. The one I always forget about is that you can access the index of a string directly. This works in JavaScript and PHP!

'example'.substr(1,1) // (from, how many characters)
'example'.substring(1,2) // (from, to)
'example'.at(1)
'example'.split('')[1] // split turns it into an array
[... 'example'][1] // convert to array via spread
'example'[1] // 🤯

Now, when checking that a string is a certain length, you normally use the length property, but you could also simply check if the index exists, to make it shorter.

let str = 'example';
let amount = 4;
if (str.length > amount) {
    console.log('string is long enough');
}
if (str[amount + 1]) {
    console.log('string is long enough');
}

The question is if this performs better or not. Also, the length bit might make it more readable.

Other problems are that zero-indexing can be confusing (hence the `amount+1`) and that when you use the index you don’t get a boolean returned but instead the character or `undefined`. So if you wanted to write this as a function you need to write something akin to:

const isXlong = (str, y) => str[y + 1] ? true : false;

Which makes it less readable again.

Nobody thrives on rejection – here are reasons I didn’t take job offers

Monday, May 29th, 2023

Sign stating Refuse to be stored in plastic sacks and placed in the containers provided

End of this month is my last day at Microsoft. I didn’t plan this. My original plan was to keep being a representative of that company and work on the amazing products it builds. Market forces, however, caused yet another reorg and as there was no other department with openings for remote work in Germany, we agreed to split. Who knows? Maybe things will change, but given the current trend of all big tech companies to “healthshrink”, I looked around for smaller, local companies.

Having been focused on my employer for 8 years without any interests in other opportunities I dived into the job market, brushing up my resume and using my network of great folks I interacted with over the years. So after a month of unemployment benefits, I will start a new role on the first of July.

All in all I sent out 19 applications, 11 of which got offered to me by contacts, recruiters, or the companies directly. Yes, I am a lucky person with a lot of privilege. But I also have a 20+ years track record I worked very hard on. My main source was LinkedIn but I also paid for two more services, both of which were pointless, but at least the payment is tax deductible.

I had a stressful time finding and choosing, mostly because of the people I met in the process. Everybody was nice and exciting to get to know. The offers, too, were really good and some made impostor syndrome hop about like a mechanical cymbal wielding monkey in my head. I had a hard time disappointing some dedicated people and hope I didn’t burn all bridges. In short, recruiters are people, too, so treat them like you want to be treated.

I also want to point out that the list I’m about to write feels weird as it may make me come across as a spoiled brat – at least to me. But I think it might be helpful for companies to know which things can cause someone like me to say no, even when all interactions were positive up to the last moment.

So, without more beating around the bush, here goes:

Work from office / bonkers hybrid work demands

With the hiatus in the pandemic it seems that most companies remembered that they have expensive offices their employers should use. Often they also had bad experiences with people working remotely. And I get it. Working face to face in a small company is a lot more efficient. I’m looking forward to working from an office from time to time again. But I don’t see the point of being a lead of a distributed team and having to do this from a place with a one hour commute when all my interactions would be virtual anyway. One company even asked if I could work from their office 400 kilometres away twice a week.

Remote work in tech is the most obvious thing to do – so don’t force people to waste time on the road who don’t want to.

Complex and rigid application processes and systems

Bureaucracy and red tape in companies is generally mentioned as one of the main sources of employee dissatisfaction. Therefore it is baffling to see how many companies made me jump through rows and rows of hoops – some of them burning – just to get to the first interview. I get it, at Microsoft we were also swamped with applications and there are many SaaS offers out there that promise a company to deal with that in a convenient fashion for the recruiters.

But having to replicate all the information in a secondary system after people found me on LinkedIn and got my CV through the “Easy Apply” process was always the first indicator that we won’t get to where we both apparently want to.

I keep my LinkedIn profile tidy and up-to-date, same with my CV. So having to fill in multi-step forms, some of them with two factor authentication and CAPTCHAs with the same information is not only a colossal waste of time, but also worries me as it means there is a copy of my information that will not get an update when I change my CV.

Other companies made me sign an NDA to get information about the job. Well, as an open source advocate this doesn’t bode well to what I will create in this role.

I wrote in more detail about one company asking me to answer a lot of questions in a written interview. They then sent me an online test to assess my skills that I had to do within a week and took three hours, demanding a full block of that time as you couldn’t pause and continue.

As stated in that earlier post, I get the idea of treating every hire equally, but treating me like applicant number 2324234 instead of catering the test to my skills and the role was another big flag for me.

I have to mention one special case though: one company asked me to do a case study showing my skills and explaining how I solved issues and paid for my time. This was a very interesting approach which gives the company something to work with and the applicant a feeling of not wasting time.

Super aggressive timelines

Starting a new job is a big decision and nobody likes to get badgered. I understand that it’s also a lot of work for companies to hire new folks and get them up and running.

I explained in each communication when and why I can start and that I needed some time to stomach the change and get ready for the new job. And yet seven companies asked if I could start weeks earlier as things are broken and it would need my amazing fixing skills right now. This is flattering, but also a big red flag.

Another thing several companies did was send me a contract that I needed to digitally sign that had a fixed offer expiration date two days later. Sometimes these came on a Friday and I was asked to sign by Monday. Huge, 9-10 page contracts full of boilerplate not enforceable or even applicable.

This isn’t “I read the terms and conditions” before downloading a demo app. This is our professional work agreement. Companies and applicants should expect that there is a necessary review and alteration period.

Automated responses and processes with no context of your application

Especially with US companies but also with agencies and government affiliated companies I had a few run-ins when it comes to automated gatekeeping. Although the job offers mentioned “degree or comparable experience” many had forms where adding a degree was mandatory and I got automatically filtered out.

It also felt like a massive waste of time being contacted by recruiters because of your profile just to be asked by every single interviewer to repeat the information in the profile in interview forms. You can give an applicant a much better feeling of being in an onboarding process if information already provided gets sent on through the stages.

Boilerplate social benefits without insight into local or personal requirements

There is a big difference between a company providing a social benefits net to feel safe in and a company that tries to impress you with perk offers that seem great, but ultimately don’t apply to you.

Some companies I talked to obviously partnered with a third party provider that offered a US package that would make folks there happy but didn’t even cover the basic legal requirements in Germany. Workplaces need to contribute to the public healthcare fund or cover part of your personal insurance.

It is great that companies offer social perks, but the most grating thing I found in some of the offers is that they are a non-starter. Many social perks, like a personal pension fund partly covered by your employer, need years of accumulation to make sense. I had quite a few companies that offered them but when I asked about the average retention of employees in the company people admitted that most folks stay for a year and move on. This felt like a strange disconnect.

Aggressive haggling and the myth of competitive salary

There was no doubt that it would be tough for European companies to match the salary and compensation package of an 8 year career in a US tech giant. So I slashed 20% of what I had earned for the convenience of working for a company that isn’t confused about European tax, social packages benefits and support instead of perpetual growth demands.

However, some of the offers were just incredibly low considering the high taxation here. Even worse were offers that had no range or figure but offered “competitive salary” instead. When I offer “competitive skills” people probably would have questions, too.

I was very candid in my demands, which went down really well with all the people I talked to. When candid answers then told me that I would earn more than most of my peers or even managers I knew I couldn’t do it. It’s good to be clear.

Huge discrepancy between skills offered and skills needed without a plan to cover the gap

I was flattered by some of the offers as it would mean I had to push myself to learn new skills or transfer to have the ones I got into other environments. It’s also a concern when there was no mention of an adjustment period or introduction to internal systems and processes programs.

Sure, some skills are easy to transfer, but I remember vividly how much I hated dealing with managers coming in not knowing half of what I did and keeping things generic not to be found out. Maybe I was too chicken there, but it would be good not to be thrown into situations where you need to prove your skills to yourself and to the people you are supposed to lead.

No job offer will be a perfect match and it is a back and forth to meet in the middle. But it would be great to have clarity on what the process of getting to learn about the company environment is and how much time you have to get enough confidence to start running the team without feeling like a fraud.

Things applicants and companies can do to make this smoother

All in all, I had a positive experience on a human level but I found that there is a lot to be improved in the processes of finding a job in tech even on the senior level I am at. I can only imagine what it would be like to apply as a junior where the human excitement of your application isn’t as high. So here are some things I found any applicant should do and I could have done better.

As an applicant you should:

  • Get ready to have a lot of demands, things to fill out and do. I was kind of rushing things in the beginning, freaking out that I will need to find a new job soon. This lead to me applying for a lot of things at the same time and feeling overwhelmed with the work this meant. Don’t panic. You will find a job eventually. It makes a lot more sense to focus on a few offers and prepare yourself thoroughly than casting a wide net.
  • Have a clear goal what you want to do – there are a lot of exciting job offers, but if you apply for the reason of having a “cool” job, you ultimately don’t have the skills for and don’t feel you will get the time to learn them upfront, you are wasting people’s – and your – time.
  • Have a list of “must have” benefits and perks you don’t back out from – that includes a minimal salary and work situation definition (remote, hybrid, on-site – in the latter case including the information how long of a commute you are ready to take on)
  • Do your homework learning about the job offer, the company behind it and what you specifically can bring to the table. This includes a CV catered to the job application and role.
  • Communicate clearly your earliest possible start date and availability for interviews and tests – I used Calendly for that.
  • Communicate if you have other offers and by when these decisions are due – this is great to speed up the process
  • Appreciate the efforts and time of people involved – recruiters and interviewers have to deal with a lot of applications. Be on time for your interviews, don’t leave people hanging with answers and have your materials ready for the different steps of the process.

Companies should:

  • Value the work applicants put into the process. We spend a lot of time writing and optimising our CVs and LinkedIn profile, so use this information but don’t ask us to repeat it all the time or fill out your internal systems.
  • Be aware of the fact that automated systems with arbitrary gatekeeping mechanisms are great to stem the flood of mass applications and fake applications but will make you miss out on great talent and start the process with a bad experience if there are false positives
  • Value the time people need to ponder your job offer and give enough time read through contracts
  • Be aware that a job application and how it is handled is a first impression that goes both ways. We always have the impression that applicants have to put their best foot forward and spruce up to get the job, but in a highly paid environment with a severe lack of talent this very much goes both ways.
  • Give a sense of clarity of what the company wants to do in the next few years and how it would affect the applicant. Freelancing is always an option and people choose to join a company for the reason of having security, not help a company even find its place in the market.

I hope this is helpful to some. It helped me, writing it down. I am happy to have met so many interesting companies and people during this last month and hope to keep in contact and work together in other capacities.