Time killers remove the focus from what is really important for us. I’ll show you the ways to get rid of them by telling my story. You can apply it to your own cases, which might be different.
At some point, I understood that scrolling social networks feeds is a drug for me — I can’t help turning on the phone screen and clicking on Facebook/Instagram icons. The first step (took me years!) is to admit you have a problem. The further journey is thrilling and beautiful and this is what I did:
Before reading forward don’t forget to subscribe to my medium account and check what we are doing at FusionWorks.
Add an additional step
As simple as it sounds — just put the icons of the time-killing apps on the second (or third if you are brave enough) screen. Or protect it with a password. In these cases, when you switch on your screen you’ll need one more step to reach your life-killers and you can think twice whether you need it or not. The empty spaces on the first screen can be replaced by Trello, a chess app (if this is not your drug) or anything else you won’t use ‘just because’.
Remember, work|life balance is not an issue if you use your time efficiently.
Plank only mode
However, I don’t have an idea of stopping using social networks. So together with the restriction, I suggest you a cheat — plank-only mode: you can scroll the social feed when staying in plank. For half a year already I’m using Facebook/Instagram on the phone only standing in the plank. Started with 1-minute sessions (at least once per day) and I am adding 10 seconds each month, meanwhile improving my health condition. By the end of the year, the minimal batch will reach 3 minutes.
Caution: you’ll be able to stay more and more and will use social networks more as well!
Eventually, doing it in plank, you’ll realize that you don’t need to know about your ‘friends’ that much! Now I know much less about what people think about different matters — and this makes me happier. Indeed, you’ll find out that not knowing the opinion of the people you don’t care about is cool. And believe me, the tension of the plank will not let you enjoy the feed and, moreover, leave useless comments. As a result, you’ll realize you don’t want to scroll it anymore.
Caution: there is a trap — your brain will go for revenge and you may find yourself scrolling Youtube feed instead. This won’t be an endless battle if you acknowledge what you are doing and will respond fast.
Even more!
Let’s see some other productivity tips that will help you properly use the time you now have:
Berserk mode. I also call it coffee mode, others name itMonk mode. Whatever you name it, the idea is simple: you commit yourself to completing a specific goal without any distractions. So you shut out every possible distraction and focus on the task at hand. This means turning off everything — phones, apps, notifications, and email — so nothing can distract you. As there are people who wrote about it better than me, you can just read this article for more details.
Doing things in blocks. Book time slots in your calendar for certain tasks. Also do it for recurring tasks, such as reading books and learning. Thus you’ll always have time reserved for what is important for your personal development.
Use headphones. Doesn’t work for everyone, but definitely helps eliminate the outside sounds. Personally, I’m using this to the maximum — my colleagues complain they can’t work because of the loud music from my headphones.
Priority tasks first. Gosh, it’s difficult — our brain works visa versa. But we are here to train this powerful beast.
Do pleasant pro-dopamine stuff. From 5 minutes to half a day — depending on your schedule. Walking, running, showering, meditation — whatever makes you wait for it with excitement.
Delegate things. Delegate what gets you down or takes too much time without giving you pleasure: cooking, cleaning, working routines. You are the main architect of your life’s timeline — build whatever makes you comfortable and makes you enjoy every single day.
“You’ll be amazed at how many things you can actually do” — people who tried this approach
As technology advances and permeates nearly every aspect of modern life, the demand for skilled IT professionals has skyrocketed. In this highly competitive job market, companies must implement effective strategies for attracting and retaining their top IT talent. While in-house hiring is the traditional method, there are alternatives to consider, such as hiring freelancers or using outsourced teams.
For those seeking to engage with outsourcing teams, I strongly recommend reaching out to my colleagues at FusionWorks.
If you are considering collaborating with freelancers for your IT needs, I strongly suggest that you get in touch with my friends at Talents.Tech.
Here are some best practices to use and learn from:
Offer competitive compensation and benefits packages
Whether hiring freelancers or outsourced teams, it’s vital to offer competitive compensation and benefits packages, taking into account the market rate for the particular IT skills required.
2. Provide opportunities for professional development
IT professionals, whether in-house or freelance/outsourced, are often passionate about learning and staying up-to-date with the latest technologies and trends. Offering opportunities for professional development, such as training programs, mentorship, and certifications, can help attract and retain top talent.
Find out who are our clients and what they say about working with us
3. Foster a positive and inclusive work culture
Creating a positive and inclusive work culture is crucial for attracting and retaining top IT talent, whether they are in-house, freelance, or outsourced. This can include initiatives such as diversity and inclusion programs, employee resource groups, and at least once per year — team-building activities.
4. Emphasize the importance of work-life balance
IT professionals, whether in-house or freelance/outsourced, often work long hours and may be on call for emergencies, but it’s important to emphasize the importance of work-life balance. This can include initiatives such as flexible scheduling, time off policies, and wellness programs.
5. Utilize the power of your employer’s brand
Companies can use their employer branding to attract top IT talent, whether in-house, freelance, or outsourced, by showcasing their values, mission, and company culture. This can be done through social media, company blogs, and other marketing initiatives.
Nice video on Running a Top-Notch IT Department — Top IT Department Problems Solved
In addition to these best practices, it’s essential for companies to consider the options of hiring freelancers or using outsourced teams. Freelancers and outsourced teams offer the benefits of flexibility, specialized expertise, and lower costs. However, it’s essential to carefully vet freelancers and outsourced teams to ensure they have the necessary skills, experience, and professionalism.
Attracting and retaining top IT talent requires a multi-faceted approach that includes competitive compensation and benefits, opportunities for professional development, a positive and inclusive work culture, a focus on work-life balance, a strong employer brand, and the option of hiring freelancers or using outsourced teams. By implementing these best practices and considering the options of freelancers and outsourced teams, companies can position themselves as top employers in a competitive job market and attract and retain the best IT talent.
As a business owner, you understand the importance of having a reliable and competent team to help you achieve your business goals. However, finding and recruiting top-notch talent can be a difficult task that can consume a lot of your time and resources. This is where outsourcing resources can be a game-changer for your business. In this article, we will explore the advantages of outsourcing resources rather than relying on a recruiting agency.
Here are some of the benefits of outsourcing resources for your business:
Access to a global talent pool — by outsourcing your resources, you gain access to a vast and diverse talent pool from your trusted company partner. This means you have a better chance of finding the most suitable candidate for your project.
Cost-effective — outsourcing your resources can be cost-effective compared to hiring full-time employees. You can save on recruitment costs, salaries, benefits, vacations, sick leaves, and overhead expenses such as office space, equipment, and supplies. Moreover, you only pay for the services you need, which allows you to scale up or down as required.
Expertise and experience — outsourcing companies specialize in providing specific services or skills, which means they have the expertise and experience to handle your project efficiently and effectively. They have a deep understanding of your industry and can offer valuable insights and suggestions that can help you achieve your goals.
Flexibility — outsourcing your resources offers you the flexibility to adapt to changing business needs and requirements. You can hire resources for short-term or long-term projects, and scale up or down as needed. This flexibility allows you to focus on your core business functions and respond quickly to market changes and opportunities.
Increased productivity — outsourcing resources can increase your business productivity by allowing you to focus on core business functions. You can delegate time-consuming and repetitive tasks to external resources, which frees up your time to focus on more strategic and revenue-generating activities.
Reduced risk — outsourcing your resources can reduce the risk of hiring mistakes, as the outsourcing company is responsible for the recruitment and selection process. They have a rigorous screening process and can provide ongoing support, which reduces the risk of turnover, low performance, or project delays.
Quality assurance — outsourcing companies have strict quality control measures in place to ensure that their services meet or exceed industry standards. This means that you can expect high-quality and consistent services from the outsourcing company.
FusionWorks is a software development company that focuses on full-cycle product development, outstaffing services and IT community building. The company was founded in 2011 by Genadii Ganebnyi and Anton Perkin.
In conclusion, outsourcing resources can be a smart choice for your business as it offers access to a global talent pool, is cost-effective, provides expertise and experience, offers flexibility, increases productivity, reduces risk, and ensures quality assurance. By partnering with an outsourcing company that understands your business needs and requirements, you can focus on what you do best and achieve your business goals.
During the COVID lockdowns and pandemic restrictions, food delivery services became a vital support system for the restaurant industry. As restaurants downsized capacity or completely shut down their dine-in options, the sector experienced remarkable growth, and numerous e-commerce marketplaces emerged. Online ordering has now become an integral component of the “new normal.”
For restaurants, keeping up with the demand for delivery means choosing the right model. One option is to use online food delivery marketplaces, which provide customers with the ability to choose and order from a diverse range of restaurants. Alternatively, businesses can choose to manage their own direct e-commerce channels. This article outlines the advantages and drawbacks of using a food delivery marketplace compared to creating your own e-commerce platform. But do you have to choose, actually?
The advantages of food delivery marketplaces
Online marketplaces are third-party platforms that partner with restaurants and offered a quick and easy way to make their products available to a larger audience of potential customers. Let’s start with the benefits they provide.
Quick and easy to setup
With the existing e-commerce and delivery infrastructure, restaurant owners need just to register and upload their menus. For the customers, the process is as straightforward as browsing, selecting, and placing an order. Food delivery marketplaces demand minimal effort and investment from restaurateurs to start delivery operations.
High volumes of customer traffic
Online marketplaces have a high volume of customer traffic that can find you because they are already coming to the site. Marketplaces have marketing budgets and are advertising on Google — which means there should be constant traffic hitting your store pages.
Focus on business
Marketplaces allow you to outsource delivery logistics, removing the headache of coordinating and executing deliveries. This gives you more time and energy to focus on making the food you love and running your business. Outsourcing deliveries also means you’re saving on manpower. There’s no need to put a hiring process in place to hire extra staff. When you don’t have to manage a fleet of drivers, you can focus on training and up-skilling your current restaurant staff.
The challenges restaurants face with marketplaces
As we see, marketplaces bring great value, however, there are also some important issues that may have both a short- and long-term impact on your business. And you should be aware of them.
Commission fees
Food delivery platforms charge between 20–30% in commission fees — I know that from the statistics and because I co-owned one. In case the restaurant’s margin is not high enough, this means reduced or even negative profits. Definitely, you can raise prices for your menu items on marketplaces, but this price discrepancy may cause reputation issues and badly influence the competition.
So while switching focus to delivery during the pandemic was a way for many restaurants to stay alive, it may not be a sustainable long-term model if you’re working with marketplaces only.
Check Dely — automated e-commerce and delivery solutions for restaurants with almost no comission.
No control over the customers
Actually, the customers are not your customers — they are the marketplace customers. Thus you sacrifice control over your customer data and remarketing. This data belongs to third-party platforms, yet your business needs it to gain customer insights. With access to data, you can discover vital information, such as the average demographics of your customers, where most of them live, or what their favorite menu items are.
In addition, when a customer buys from an online marketplace, the marketplace earns their loyalty, not you and your brand. So at the end of the day, the cost of using online marketplaces is your relationship with your customers.
You are one of many
On a third-party food delivery platform, your restaurant will receive more visibility, but you can end up a small (and not that desired) fish in a large pond. Although customers have the option to search for various cuisines or specific businesses, standing out from competitors may be challenging. Moreover, there is minimal transparency regarding the criteria for how the marketplaces rank the restaurants within the app or the reasons why certain businesses are featured while others are lost among numerous competitors. Also, be aware of the price wars.
Ironically, the same platform meant to be your partner can sometimes hinder your success in online delivery and drive customers away. Food delivery marketplaces have increasingly invested in “dark kitchens,” dedicated spaces for preparing delivery-only meals located on the city outskirts where rent is cheaper. This development not only introduces new competitors with lower operating costs but also pushes the competitive environment beyond its previous limits.
Possible brand issues
If a marketplace offers a poor delivery experience, your brand suffers. Research shows that 84% of customers will not buy from a business after a single bad delivery experience. That delivery experience is an extension of your brand as well as the marketplace’s brand. You need to ensure you’re delighting your customers with every brand interaction including delivery, service and product quality.
Last, but not least. Be aware of the risk of getting suspended or banned from the platform, e.g. when customers are unhappy and/or their concerns are not responded to on time. So definitely you need a plan B.
The advantages of your own solution
Building your own direct-to-consumer (D2C) e-commerce channel is an alternate or additional model for food delivery. It means owning the ordering experience of your customers from start to finish, getting increased profits and having more control. This a smart move for long-term sustainability.
Increased profit
Using your own e-commerce platform results in significantly lower commissions (or no commissions at all if you buy the solution instead of renting it) for each order, allowing you to maintain healthier profit margins. Also, you’re either paying for an in-house delivery driver or working with a delivery partner and paying a fixed fee for the service. This commission fee model is not only fairer, but it’s also particularly advantageous for your biggest orders.
Your brand
Selling through your own delivery channel means you control how your app or website looks and feels. You can use your brand colors, logo, font, and even your tone of voice. With that kind of hands-on control, you can easily update menus and photos and correct any issues in real-time. This helps you stand out from the competition and build a direct relationship with your customers.
Direct marketing
A proprietary food delivery channel means you own and control your customer data. Through analyzing this data, you can tailor marketing offers to individual customers. You can offer specials, deals, or rewards based on past orders and help your customers feel cared for. These personalized experiences lead to enhanced brand loyalty and more business.
Dely.io allows you to create and manage customized promotions, discounts, and loyalty programs.
A hybrid solution to maximize sales and profit
And here the good news is coming — food delivery options don’t have to be an either-or choice. In fact, a hybrid or blended model can bring you the best of both worlds:
Leverage existing food delivery marketplaces to generate orders and quickly grow your reach.
Add and perfect a branded direct-to-consumer (D2C) delivery channel so you can harness direct orders at a lower cost to you while building brand loyalty.
By diversifying your approach, your business can grow sustainably. With this hybrid food delivery model, you capture a variety of customers and maximize your profits in the long run. Also, this means you always have a plan B.
Getting started
Let’s move on to practical steps. If you’re considering setting up your own delivery channel, all it takes is several simple steps.
Find the right partner
First things first, choose your partner carefully. Today these e-commerce partners offer more than just a storefront; they come with all the trimmings too — robust reporting, social media integrations, SEO tools, and even ad integrations. A platform like Dely can help power all your food deliveries directly from your website. This allows you to focus on what you do best while leaving your delivery needs in the hands of a fast and reliable fleet of couriers. Set yourself up for success.
Encourage customers to order directly from your own channel
The good news is that 44% of customers prefer ordering directly from a restaurant’s website or mobile app, according to a survey conducted by digital ordering solution Tillster. All you have to do is make it easy (and pleasant) for them to do so. First, make sure your e-commerce channel looks and feels like your brand. Make it easy to use, and keep improving the customer ordering and delivery experience. Tweak the options and settings until the experience is as smooth as possible.
Do marketing and re-marketing. Keep customers truly yours
Consider various marketing and advertising opportunities, from print or digital ads to social media campaigns. Don’t forget traditional marketing strategies, either. Flyers and leaflets distributed in your area can go a long way. And then there’s the oldest trick in the book: satisfied customers lead to free advertising in the form of good, old-fashioned word of mouth. Also, set up re-marketing campaigns to keep your clients loyal to your solution.
As a conclusion
You don’t have to choose. Smoothly start or continue with marketplaces and your own channel — diversify and get the most out of both.
And one more thing. Try Dely.io which would allow you to have a comprehensive solution that is customizable and scalable to fit your needs. Sign up for a demo here or apply for a direct demo performed by the head of the product.
In the long and SOMEtimes coherent blog series below, I made a case against web scraping, when justifying why my Google Chrome Extension does what it does, the way it does (very little, but quickly, respectively. 😋)
However, I web-scrape almost daily; not as a recruiter, but as a sales helper, automating the influx of leads at the awesome place that is FusionWorks!
Due to my “90s Computing Mindset ™” (described here and there) I’m obsessed by optimization (even if apps run on superfast Cloud servers! 🤪) So I always web-scraped “the hard way”: manipulating the hell out of strings via JavaScript (almost a forced choice on Google Apps Script.)
But as I discovered a couple of times already, while this mindset is good for performance tuning, it can often prove to be overkill nowadays, as small speed differences are not noticeable on small workloads. Nobody wants to tune a Toyota Prius for racing, at least nobody sane! 🤣
So I told myself: let’s see what the normal people are using, for once… And now I’ll report what I learned in little more than 2 hours of deep dive, comparing stuff for your convenience… Or amusement!
The hard way: the (lovely) hell of string manipulation
While I see many don’t like JavaScript string manipulation, I find it fascinating, and much easier than the hell I remember from my self-taught C++ years (although I can’t be sure: it was almost 25 years ago! 🧓)
NOTE: This assumes no access to the DOM, because of environment constraints. It’s the worst-case scenario: treating pages as strings!
I went from “blunt force” splits, forEach cycles, and bad if/else’s (I had just started coding 😅) like this function for the extraction of keywords:
To the less “janky”, less nested, faster version here, using a Set for the dictionary and a for…of on it. Gained around 15% in speed! (The additional stuff existed in some form in the previous one too, but I can’t be bothered to dig the old commits… 🤣)
… To working directly with indexOf and substring (in a different use-case.)
The difficult part here is understanding what works best when it comes to finding the HTML elements/attributes we need.
As I found out, it’s often not worth thinking too much about this stuff: whether you split everything and work on string arrays, use indexOf and substring, or do something more spLice-y (dev-dad joke 🧓)performance will be similar. E.g.: a version of the above using split got almostthe same speed.
Speed is more influenced by loops, and where/how/when you store stuff.
I recommend using Map and Set objects when it makes sense, since they can be even faster than arrays when looking up stuff, or just being mindful of when you’re copying stuff, and when you’re just referencing objects.
About loops, more serious people than me found that the fastest is usually the classic for (bad for other reasons) or forEach, while “for in” and “for of” are usually slower, though the latter is amazing with Sets and Maps.
If like me you do this stuff from Google Workspace Apps, which run on GCP for free, you won’t feel much of a difference, so just go for what’s more readable for you, or if working in a team, what the team agrees is best! 👍
Cheerio: a library that makes things easier… Especially screwing up!
Yes, I didn’t become a fan of this cheerful library, at all…
I think it exists just to make jQuery veterans happy. Performance is very similar to regular string manipulation (obviously, since that’s what’s under the hood), but you’ll find that any dynamic content that takes time to load on a page is totally out of reach for Cheerio, when even puny URLFetchApp on Google Apps Script can actually get it!
If like me you’ll look for a solution to this on Stack Overflow, you’ll find replies telling people to just stop using Cheerio, and use Puppeteer, instead! 🤣 (Which I did!)
To be sure, I also asked ChatGPT, and indeed it confirmed that dynamically-loaded content is not going to be seen by Cheerio. ⛔
I couldn’t believe this, so I tried introducing some artificial delay (after asking ChatGPT and being told it could solve this) but none of my or ChatGPT’s solutions actually worked. Thanks for nothing, AI! 😏
Puppeteer: now we’re talking! Unless you want to deploy for free…
Puppeteer is widely considered one of the best tools/frameworks to scrape the web using JavaScript, thanks to its headless browser approach.
This is what you want to use to actually interact with pages, for example logging into websites, or just waiting for content before extracting data.
I really liked Colby Fayock’s guide to deploy Puppeteer serverless.
But if you try the same now it won’t work because of dependencies’ versions conflicts, and an increase in size of chrome-aws-lambda plus puppeteer-core, above the memory limits of Netlify’s serverless Functions. (For once my 90s Computing Mindset ™ is relevant! 🤣)
You might have some luck if you use his exact same dependency versions…
But I didn’t try because I realized: I don’t need it hosted as an API! While it’d definitely be cool, I can actually just run it locally, and make it send data to a web app I already have online, like my own Google Apps Script!
As an HR Professional with a strategic mindset and 9+ years of experience in this mysterious field, one of the most important aspects of my team’s job is to ensure that we have the best talent available for our organization. In today’s digital age, when everything is changing so fast, the reality of work has changed as well, and hiring dedicated skilled freelancers has become a popular choice for businesses. In this article, I will highlight the advantages of working with dedicated skilled freelancers who have been selected by a team specially tailored to your organization’s needs, along with a solution that may save you time and money.
“A stress-free way to hire tech teams” — Talents.Tech
Advantage Nr.1 — Flexibility to scale your workforce up or down based on your business needs. This means that you can easily tap into a pool of talent who are readily available to work on your projects, without having to worry about overhead costs such as office space, benefits, and training expenses. In addition, the ability to scale your workforce means that you can easily adapt to changing market conditions or project demands.
Advantage Nr.2 — Bring a wealth of expertise and experience to your organization. By working with a team that has been specially selected for your needs, you can be assured that they have the right skills, knowledge, and experience to deliver quality work. This means that you can tap into a pool of talent that has already been vetted and evaluated, which saves you time and resources in the recruitment process.
Advantage Nr.3 — Opportunity to tap into a global talent pool. This means that you can access talent from different parts of the world, who bring unique perspectives and skills to the table. By working with a diverse pool of talent, you can analyze their different backgrounds and experiences to create innovative solutions for your organization.
Advantage Nr. 4 — Long-term relationships with your talent pool. By establishing ongoing relationships with your freelancers, you can build trust and loyalty, which translates into a stronger and more productive workforce. This means that you can tap into a pool of talent that is committed to your organization’s success, and who is willing to go the extra mile to ensure that your projects are delivered on time and within budget.
Did you know that Talents.Tech works in just 4 easy-steps?
(1) The client submits a request
(2) AI algorithms select a list of suitable profiles
(3) The client chooses a candidate from this list
(4) Work Starts
When a company chooses to work with a freelancer, there are a number of potential challenges they may face. Here are some of the most common problems a company may encounter when choosing to hire a freelancer:
a) Finding the right candidate: This requires a deep understanding of the job requirements and a thorough screening process to identify candidates who possess the necessary skills, experience, and cultural fit.
b) Time constraints: Companies often have to work within tight deadlines and face pressure to fill job vacancies quickly. This can be particularly challenging when there are multiple positions to fill simultaneously.
c) Quality control: It can be difficult to ensure consistent quality when working with freelancers, especially if they have different work styles or standards than your company.
d) Communication: This can be more difficult with freelancers, as they may not be as readily available for meetings or check-ins.
e) Accountability: Because freelancers are not full-time employees, they may not feel as invested in the project or company, and may not take accountability as seriously as an employee would.
f) Dependability: Freelancers may have other clients or commitments that take precedence over your project, making it difficult to rely on them for timely delivery.
g) Cost: While hiring a freelancer can be more cost-effective in the short term, it may end up costing more in the long run if the work is not up to standard, or if you have to continually hire new freelancers to replace those who do not work out.
Talents.tech was specifically designed to address these real problems that companies face when working with freelancers. They understand that finding the right talent can be a time-consuming and costly process, especially when you’re trying to build a team that’s tailored to your organization’s specific needs.
Our partner’s platform was created to help companies overcome these challenges by providing a curated pool of talented and skilled freelancers interviewed and tested by a team of experts in their respective fields. AI algorithms select the best from the best and propose you a list of profiles that are suitable for your own project. This means that you can be assured that the freelancers you work with have the right skills and experience to deliver quality work on time and within budget.
Along with these, their platform is designed to offer companies the flexibility and scalability they need to adapt to changing business needs. Whether you need to scale your workforce up or down, our platform makes it easy to find the talent you need, when you need it.
Why work with Talents.tech? Professionally screened candidates. The vast range of specialists. Small service fee.
In conclusion, working with dedicated skilled freelancers who have been selected by a team specially tailored to your organization’s needs offers a range of advantages, including flexibility, expertise, global reach, and long-term relationships. By pointing out these advantages, your organization can tap into a pool of talent that is committed to your success and who can deliver quality work on time and within budget. Talents.tech is the answer to the real problems that companies face when working with freelancers. They provide a simple and effective solution that saves time, reduces costs, and ensures that you work with the best talent. Being a huge part of the HR team, I recommend that organizations explore the benefits of working with dedicated skilled freelancers that were selected especially for their needs and projects. As there is no bad or good professional, there are just collaborations that can not succeed without dedicated magic, present during the recruiting process. In our case — this is done by the harmony between human proficiency and AI correctness.
If all these arguments are not enough and you still want to work and collaborate with ”sweet outsourcing”, feel free to contact our trusted team at FusionWorks. As we know how to build your product from scratch or join the existing team as we are TECH-ORIENTED. PEOPLE-CENTRIC. LEARNING-DRIVEN.
As the freelance workforce continues to grow, companies are increasingly relying on freelance talent to meet their business needs. While hiring freelancers has many benefits, such as cost savings, flexibility, and access to specialized skills, it also comes with its own set of risks.
As an HR specialist with 9 years of experience, I’ve seen firsthand the challenges that companies face when it comes to hiring freelance talent. In this article, I’ll share some best practices and strategies to help companies minimize the risks associated with freelance talent acquisition.
Looking for your next employee? Fill in a form here and the magic will start.
Clearly Define Project Scopeand Expectations— one of the biggest risks when hiring freelancers is the lack of clarity around project scope and expectations. To limit this risk, it’s important to clearly define the project scope and expectations upfront, including deliverables, timelines, and communication protocols. This will help ensure that the freelancer understands what is expected of them and can deliver the project on time and within budget. If you need help here, feel free to contact FusionWorks, as one of their directions is consulting.
Conduct a Thorough Screening Process — when hiring freelancers, it’s important to conduct a thorough screening process to ensure that they have the necessary skills and experience to complete the project successfully. This may include reviewing their portfolio, checking references, and conducting interviews to assess their communication and collaboration skills. No need to hire expensive consultants, start using Talents.Tech.
Use a Contract or Statement of Work — to protect both parties, it’s important to use a contract or statement of work that clearly outlines the terms of the project, including payment, intellectual property rights, and termination clauses. This will help ensure that both parties are on the same page and can avoid any misunderstandings or disputes down the line. You may hire a legal consultant here, in order to draft all needed documents once and you may use them happily after.
Set Clear Performance Metrics — to ensure that the freelancer is meeting expectations and delivering high-quality work, it’s important to set clear performance metrics upfront. This may include deadlines, quality standards, and communication expectations. Regular check-ins and performance reviews can help ensure that the freelancer is meeting these metrics and can help identify any issues early on. Setting clear and correct key metrics is crucial for any organization that wants to succeed, if you need any help here, contact FusionWorks as they always have the solution to your needs.
Build Strong Relationships with Freelancers — building strong relationships with freelancers can help minimalize the risk of turnover and ensure that the freelancer is invested in the success of the project. This may include regular communication, recognition of their contributions, and opportunities for professional development.
In conclusion, hiring freelancers comes with its own set of risks, but by following these best practices and strategies, companies can proactively approach in order to minimize these risks and ensure the success of their freelance talent acquisition efforts. By clearly defining project scope and expectations, conducting a thorough screening process, using a contract or statement of work, setting clear performance metrics, and building strong relationships with freelancers, companies can reap the benefits of the freelance workforce while minimizing the risks.
Additionally, companies can make the process of hiring freelancers even easier by choosing a suitable platform for their needs. One option is a worldwide staffing and recruitment platform that connects businesses with technical teams, providing a stress-free way to hire tech teams and ensure a positive experience while having a productive collaboration with freelancers. By utilizing a platform that offers pre-screened talent, companies can reduce the risk of miscommunication and ensure a successful project outcome.
Another solution here is to forget about freelancers from all over the world and to continue working with outsourced teams. Choose your partner taking into consideration their expertise, portfolio, and of course — other reviews.
Finally reaching the end of this 1–2–and now-3-part series! Or am I..?
Thanks to the great learning opportunities at FusionWorks, even a lowly tech recruiter like me has lots of coding stories to tell, but the question is: are they entertaining for peopleother than the 2 or 3 inside my head? 😂
This time, thanks to the omnipresence of Chat-GPT in my (and many others’) workflow, I think I got a funny story, of which I’ll spoil the conclusion right away: developers, software engineers, or however else “coding people” self-define, are still not going to be replaced anytime soon! 🥳
DISCLAIMER: Like crypto-bros say “don’t take this as financial advice” I’ll say “don’t take this as coding advice”! I’m a tech recruiter, not a developer! 😁
A bit of context/recap!
Finally reaching the end of this 1–2–and now-3-part series! Or am I..?
Thanks to the great learning opportunities at FusionWorks, even a lowly tech recruiter like me has lots of coding stories to tell, but the question is: are they entertaining for peopleother than the 2 or 3 inside my head? 😂
This time, thanks to the omnipresence of Chat-GPT in my (and many others’) workflow, I think I got a funny story, of which I’ll spoil the conclusion right away: developers, software engineers, or however else “coding people” self-define, are still not going to be replaced anytime soon! 🥳
DISCLAIMER: Like crypto-bros say “don’t take this as financial advice” I’ll say “don’t take this as coding advice”! I’m a tech recruiter, not a developer! 😁
A bit of context/recap!
My Chrome Extension grew almost exponentially since last time we “spoke”, at least in my perception… For the world outside of my head, it’s still quite a simple app that scrapes data and sends it to a Google Apps Script web app I also wrote, which in turn writes it on a Google Sheet.
A well-thought-out extension would surely be able to do all this without the intermediary, but I prioritized speed, or better yet EASE of learning.
Still, whenchoosingeasypaths, one sometimes ends up doing morework…
For example, it’s not comfortable to maintain 3 different codebases for what is essentially a mass structured copy-pasting, but it’s also conceptually much easier than creating a monolithic app (and anyway the 3rd codebase, the scripted part of the destination Google Sheet, would not be avoided.)
A story within the story (⏩Skip if not into coding!)
New things included a massive refactoring to an async–await pattern I finally decided to learn, replacing nested callback functions which i used to like, and now see ugly as hell! 😂
This is also used to preload imageData for the waiting animation, and this part sparked quite a debate online, for my usage of forEach with async…
While not directly related to the main story, which has to do with CRUD operations on Google Sheets, coding-wise both issues have to do with how arrays work in Java/TypeScript: again, DOSKIP this if not into coding!
The question about this code was: will Icons[] be ordered like ImgNames[]?Yes, because even if the promises all fulfill at different times, the array positions the data will fill in the array are explicitly referenced by index.
I get this is not considered good practice, and probably hard to test, but the thing is many more elegant solutions are forbidden in the context! 🤔
First of all, we can’t really draw image elements here, because this is the Service Worker part of the extension, so it has no page/DOM of its own.
Second, it can’t use modules or be a module of its own (a recent Chrome update has introduced the possibility, but requiring quite a few systemic change I didn’t yet want to commit to), so “top-level awaits” are not allowed.
An alternative is to use this (IMO ugly) thing called IIAFE (Immediately Invoked Asynchronous Function Expression) to go around the above limitation, by encapsulating the “await” while still executing it right away.
I tested both and didn’t notice any changes, but I’ll be welcoming comments on what you think about this coding debate! 🧑💻💭
The actual story: FAST remote I/O on Google Sheets!
Finally getting to the heart of the topic, the extension now (finally) works using the POST method to communicate with the Google Apps Script part, and that was actually a necessity, since now it can get 25 contacts at a time, and the URL would have gotten extremely big if sending data via GET…
What it does is filling in a custom contact type procedurally, in a typical double-loop fashion going through rows and columns of the table.
The way it manages this neatly is by giving the type definition the same keys as the column titles on the page. Plus a lot of typecasting to force things a bit, which might mean TypeScript is a bit wasted here? 🙄 Let me know!
The receiving end is where the story lies. It divides incoming contacts into new or existing, adding or updating accordingly. While this may seem the easiest thing in the world, doing separate I/O operations for each entry would (and did) take FOREVER, even if we’re talking only 25 contacts at a time.
This is due to the positioning of RichTextValues in relation to ones that can’t be RichText on the Google Sheet, and how GAS forces writes to be only in contiguous ranges. It meant 4 writes per contact, if done one by one! 🙈
But something you learn of Google Sheets scripting, is that it’s faster to rewrite THOUSANDS of rows in one go, than 10 rows in separate calls!
So to make sure these 25 updates would be done in a short amount of time, I realized I should have adapted to Google Sheets’ ways, the hard way:
Instead of having values that can’t be RichText in-between values that are, forcing me to differentiate the ranges to read and write the data, have all RichText values as close as possible (fortunately this meant just moving a hyperlink to another column, without changing the content.)
Instead of writing each line separately, process everything in the arrays, then write all lines, INCLUDING those not updated if they are in-between updated ones, so only 2 I/O operations are done respectively for adds and updates: 1 for normal and 1 for RichText.
This could lead to a total of 4 I/O operations from a previous total of 4 ops for all new plus 4 for each updated, so down from 52 on an average of half-new half-updated, or down from 100 if all needed to be updated! 🤯
Granted, the operations are bigger than before, especially if by chance the contacts to be updated are separated by thousands of rows, but wait and see the performance gains I got, after hoops and hooks with our beloved…
Chat-GPT: endless source of (ridiculous) solutions!
I had several theories on how to approach the problem, and as is usual for a noob like me, I went with the most complicated/stupid approaches first…
At one time for example, I had row numbers written within the raw data, just to be able to find them when the object was “flattened” to the actual fields I needed, so I had to slice out the row number before writing… 🥴
Although performance was not so bad (was still much better due to I/O reduction), it was such a shameful repetition: I already had the row numbers from the first division of new VS existing contacts, so why again?
The problem looked “geometrically” as follows: taking data from a 25-rows 2D array with row numbers, and use it to replace 25 rows within another 2D array of up to 3000 rows, without obvious row numbers… (Obvious 😏)
Asking solutions to Chat-GPT, I got answers that were incredibly weird…Here is a first reply about how to find the start and end row in the first place, which was suggested as a giant array reducing.
I thought it was a waste, and though I couldn’t pinpoint why right away, I proposed thisONE-LINE solution to ChatGPT, asking if it wasn’t better.
ChatGPT admitted it was better, but it noted it could have been slower or more memory consuming for large arrays (25 rows definitely isn’t big.)
Now I wanted to avoid a find on each iteration, although ChatGPT didn’t find it problematic. When prompted, it suggested a lookup object like this:
While it may seem more “elegant”, I still felt like both me and the AI were overlooking a MAJOR way of simplifying the whole problem. It wasn’t about wrong answers, but wrong questions.
The right question was: why mapping 1000s of rows to change 25, instead of going through the 25, and updating only those? Execution time was ok, but my frugal 90s Computing Mindset ™️ was SHOUTING it was a waste! 😣
I was slowly catching up to the solution, but the AI didn’t help: when I pointed the issue, it proposed a puzzling double-counter tracking system…
Here it dawned on me: I already had a list of row numbers mapped in the same order as the data source: what stopped me from just changing the entries from the source, and then writing the updated array?
Nothing! Just my slow mind, and an AI that can’t think creatively!
So here’s the super-simple solution I should have thought before…
The trick was once again to think about array positions: since I already had an array of row numbers in the same order as the incoming contacts (created to find the first row to update, as seen above), all I needed was to subtract the value of firstRow from each row, and I had the position in the slice of sheet I was considering, starting from 0 as it should be! 😅
Now using this it takes around 5 seconds to do everything, while before it could be between 12 and 25. Saving up to 80% of the time is BIG! 🥳
Conclusions: we’re STILL SAFE from AI overlords! 😁
And there was not much creativity involved here: it was actually the kind of stuff I expected the AI to shine on, so just imagine the mess on real issues!
Plus, as stated by the blogger above, another point to consider is how much time one can LOSE by using Chat-GPT: we will want to try the solutions it proposes, and more often than not it will result in wild goose chases..! 🦆
Conclusion: use Chat-GPT, but only for very, very simple tasks, asking extremely clear and limited code snippets, just to speed up your writing.
But when it comes to real problem solving: DON’T EVEN! 😂
Delve into the rest of my coding journey at FusionWorks, in the articles below!
Recruiter Codes Chrome Extension: pt.1, pt. 2 (Google Chrome TypeScript)
Hello, and welcome back to this old “series”, that I resurrected for a “mini-episode”, rather disconnected from the rest.
If you’d like to check out the rest (pt. 1, pt. 2, pt. 3), it was basically a trip into my first coding steps with Google Apps Script, at first in JavaScript, then TypeScript, to automate stuff for recruiting, and lead generation.
More recently I wrote a Chrome Extension for recruitment (pt. 1, pt. 2) that basically gives an easy way to copy and sort data from LinkedIn and not only.
You can find it on GitHub too, but it won’t work without a web app hosted separately: if interested, let us know!
Diving into what ChatGPT could not “solve”, it’s also related to LinkedIn, and it’s in the context of lead generation. As mentioned previously, for a company like FusionWorks that offers great software engineering services, lead generation is a lot like job-hunting!
So with little more than 1200 lines of code, written little by little, I built a sort of personalized CRM that self-populates with job posts and related contacts. It’s all within Google Sheets, but indexed like a database.
Now, what problem could this system face, that ChatGPT might have helped me solve, but couldn’t? Let’s dive in!
The problem with self-populating spreadsheets is… Population!
Duh, right?
Yes, after a couple of weeks running fully automated, we had too many leads, and the issue was that while color-coding of dates would mark old leads, one would still be curious to check if they were still open or closed…
Easily solved, though: make a script that checks jobs’ status automatically. Then you just periodically remove all the closed ones with another few lines of script, and the sheet over-population issue is gone!
Since at that time we were using only LinkedIn as a source, it was pretty straight-forward: just verify how job posts display the open/closed status, and parse for that element. (Although without querySelector or any of the DOM functions JS developers love, since Google Apps Script can’t access those.)
However, there are two problems with this:
If you make the script check thousands of posts at top speed, the IP of the Google server hosting you will get automatically blocked by LinkedIn for excess of requests, so you will get no info after a few fetches.
If you make it wait between each fetch a time random enough to simulate human behavior, and long enough to be meaningful, the script will require more time than what Google allows. (7 minutes, I think.)
You might think ChatGPT couldn’t solve this problem, but that’s not exactly the point. The thing is ChatGPT didn’t realise there was such a problem at all!
ChatGPT sees no problem at all, and that’s the problem!
I can’t produce screenshots of the replies, since ChatGPT spends more time at capacity than being usable these days, especially for old chats, but the thing is it was replying as if there was no execution time limit you can hit.
What it was suggesting, was to write the checking function, and then making it recursively call itself with setTimeout(), at randomized times.
Nope! the script has to run to keep track of time, so it would exceed the Google limit. Even if one would host this somewhere with no limit, it wouldn’t be very efficient: why having something running just to wait?
So I reminded ChatGPT of the time limit issue, and things got even funnier!
It now suggested I run the whole script with setInterval(), so the script would only run when needed… As if I didn’t need another script running all the time, to run a script at intervals!! 🙉
But I’m not telling the whole truth, here. 🤥 Truth is I knew the solution to this already, and just wanted ChatGPT to write the code… So in the end, I specifically asked code for the solution I wanted.
When you know the solution to a problem, it becomes easier. Duh!
What was needed was a script that would check a small amount of jobs, and then schedule its self-re-run via the Installable Triggers of Google Apps Script.
This way the execution time limit would never be reached, and you’d have enough time between fetches for LinkedIn not to consider it a problem.
With such a prompt, ChatGPT produced a quasi-viable solution: the code to check the jobs was not there of course (I knew it couldn’t know a LinkedIn’s job’s HTML structure, so I didn’t ask it), but the rest was ok, and so was the scheduling of its own re-runs.
It even got right the fact you’d need to use the Apps Script so-called PropertiesService to make it remember the last thing it checked. Tip: if you build something like this, don’t use Document or User Properties, and go for Script Properties instead. This way you can see them in the project settings:
But again, it screwed up on something related to the context in which we were running the code. Such a function would have created a growing number of one-shot triggers that, if not cleaned up manually (one by one) would make you reach the limit of triggers in a very short time.
But at this point, I stopped being lazy and just wrote the thing myself: I just needed something that cleaned up after itself, deleting the trigger that triggered it after installing the next trigger.
I ended up with this “Homunculus” function being a generic scheduler that cleans up after itself using the Script Properties you saw above for storage:
I just call it from the function that checks for the jobs status, put min and max seconds, and it will schedule a run for that same function at a random time between the provided ones.
Now through the “ticker system” I mentioned around here, giving status messages in sheet tabs, I always know when and what it checked last, and when it will work next, like this…
… Or if I wait because I wanna see the magic happening live… 😁
Yes, it’s conclusions time, because Medium stats tell me people rarely reach half of my usual articles, so we got to cut… 🤣
In conclusion: even with very specific prompts, ChatGPT will make mistakes when you’re working in an environment that has lots of constraints.
It knows those constraints separately, but can’t apply them to code it generates, unless you basically ask a specific questions about them.
If I would have not thought of a solution myself, ChatGPT would have been completely useless here. But if you do know the solution and specify it in the prompt, it is a nice homunculus to write the tedious stuff for you…🧟
Next I’ll dive again into the Chrome Extension, and the web app I built to support it… Unless you have suggestions. Please do have suggestions!! 🤣
P.S.: I wanted to put screenshots of ChatGPT’s replies, but turns out it never saved those conversations, as I guess they happened before it had chat history… So I tried to replicate this, and now it gives the right answers straight away, down to the deletion of old triggers… Did my negative feedback teach it? Were my prompts just terrible before? We’ll never know!
Dependencies are often treated lightly, and few ever consider the risks introduced to the project with every new library you may want to use.
Do you need a lib for it?
According to studies, over 90% of the code in our projects comes from libraries.
The upside is that this removes from you the burden of implementing big, complex systems because someone has already done that before you. On the other hand, 90% of the time you have no idea what’s happening inside your project during runtime, so you lack control over things you are liable for.
Of course, things aren’t as scary as I am putting them here, but I still believe that we should be aware of what we are dealing with.
Obviously, there is no point in us reinventing the wheel, so we depend on dependencies. Still, we should take some precautions. We’ve summed up some things you might want to consider when you need to integrate someone else’s work into yours:
Think of the value the new library brings to your project.
Discuss with your team the problem you are trying to solve and consider and compare alternative solutions. Decide if it’s a viable solution to bring a new tool for the job, or if you’d get by with an in-house solution.
In bigger projects, it is often a problem when similar problems have already been resolved by other project contributors and a fitting library is already installed. Check your project’s codebase for similar problems. You may be surprised and might even save some time.
Assess the library’s credit of trust.
When considering a new tool, study the community’s opinion on it. It should give you an impression of how well it does its job, but also what new issues and overhead it might introduce.
Check the library’s issue tracker, see how well it is supported, and observe the communication between issue reporters and code maintainers. You’ll want to avoid solutions that have an unpredictable or stagnant release cycle, unaddressed questions in issue threads, tiny communities lacking experience in their niche, documentation composed of a few usage examples, and an undocumented API.
The dangers of Open Source
While open-source sounds like a great idea to many enthusiasts because it is maintained by the entire community, the reality is that this ecosystem is very vulnerable to the mistakes of lone individuals (an infamous example).
Security implications
Depending on open source software means you lose control over a critical chunk of your project, and, in the most optimistic case, it means you might get a hard-to-catch bug. In the worst case scenario, you’ll introduce a security vulnerability and your entire production infrastructure will fall prey.
It is a misconception that open source is safe because everyone can review the code and projects are being maintained by groups of individuals with no commercial interest in the project’s path. Reality is different. Usually, most libraries in your projects are rarely maintained (during free time) by the solo efforts of individuals who have just decided to publish their personal tools. And these libraries, in their turn, depend on other libraries, again with variable levels of quality.
Another thing to consider when you decide to use a library is how well it controls its dependencies’ versioning. As it was mentioned before, libraries usually depend on other libraries, and that might become an issue if they do not manage their versions well.
When you install a new library, dependency managers in most programming languages follow the SEMVER versioning pattern, which allows flexible version ranges for your libraries. Many small libraries use ranged versions of dependencies rather than fixed versions. This, potentially, creates an avalanche of bugs in case just one of the dependencies in that tree fails after a minor patch. This kind of situation has occurred multiple times throughout the open-source software development history.
This creates the situation where your project may fail with no obvious reason the next time you clone it from the repo and sync the dependencies.
#ItWorksOnMyMachine
Most dependency managers create a lock file when you install a library. Many of us ignore it, some of us even .gitignore it, but let’s make it clear why it needs to exist in your repo.
When you install your libraries, your dependency manager resolves all the shared libraries, builds a dependency tree, and finds compatible dependencies to download and store. This information contains fixed versions, which should work on every machine if it works on yours.
Why do we need this? When the time comes and we have to publish our efforts to production, usually a Continuous Integration system takes over our code, clones it, syncs the dependencies, builds everything, and… fails with some version mismatch. You’ll be lucky if it fails during build time and not in runtime.
The lock file allows the CI to install exactly the same versions you had in working condition on your machine.