Blog

Blog je mesto gde možeš da čitaš o navikama IT-evaca, najavama IT dešavanja, aktuelnostima na tržištu, savetima i cakama kako da uspeš na ovom dinamičnom polju.
Mi pratimo trendove, na tebi je da se zavališ u fotelju i čitaš :)

Blog JavaScript
Tag: JavaScript (116 rezultata)
16.05.2024. ·
11 min

Syncing Data from DocumentDB to OpenSearch using Change Streams

Change streams are a feature of Amazon DocumentDB that provides a time-ordered sequence of data change events that occur within a DocumentDB cluster. Change streams can be enabled for an individual collection and can be configured to provide the complete document rather than only the change that occurred. Change streams can be integrated natively with a Lambda function, which gives us wide array of possibilities. In this tutorial, we will demonstrate step by step how to synchronize real-time data changes from a DocumentDB cluster to an OpenSearch domain using change streams and a Lambda function. At the end of the tutorial, we will have an infrastructure as shown in the image above. We will create a VPC, DocumentDB cluster, OpenSearch domain, API gateway, and four Lambda functions. Three functions will be exposed via the API gateway: one for writing data, one for reading data, and one for configuring the DocumentDB collection. The fourth function, which is the most important one, will be connected to the change stream and perform data synchronization. Both the functions and the infrastructure will be written in TypeScript and deployed using CDK. The repository containing the entire code can be found here. Let’s get started! VPC setup We create a VPC using CDK’s construct. This one-liner creates a VPC with a private and a public subnet and sets up network routing. Next, we create three security groups: one for Lambda functions, one for the DocumentDB cluster, and one for the OpenSearch domain. As the Lambda functions will perform CRUD operations on data stored in DocumentDB and OpenSearch, we add ingress rules to the DocumentDB and OpenSearch security groups, authorizing access from the Lambda security group. Additionally, we include a self-referencing ingress rule in the DocumentDB security group, which will be explained later on. DocumentDB setup We create a DocumentDB cluster using CDK’s DatabaseCluster construct. The engineVersion is set to 4.0.0 since this is the only version of DocumentDB that supports change streams. The DatabaseCluster creates a master user secret for us and stores it in Secrets Manager under a name defined in masterUser.secretName. We set the vpc and securityGroup properties to the previously created VPC and DocumentDB security group. To launch the cluster in a private subnet, we set vpcSubnets.subnetType to SubnetType.PRIVATE_WITH_EGRESS. The DatabaseCluster will automatically select private subnets that have only outbound internet access. We also set the removalPolicy to RemovalPolicy.DESTROY to ensure the cluster is deleted when the stack is deleted, avoiding any unexpected costs. OpenSearch setup To set up the OpenSearch domain, we utilize CDK’s Domain construct. The properties vpc, securityGroups, and removalPolicy are set in the same manner as for the DocumentDB cluster. For the vpcSubnets property, we cannot use automatic subnet selection as we did in the DocumentDB setup. Instead, it is necessary to explicitly define exactly one private subnet since we only have one OpenSearch node. For the simplicity of this tutorial, we rely on IAM to authorize access to the OpenSearch domain. The Domain construct does not create a resource-based IAM policy on the domain, known as the domain access policy. This allows us to authorize access using identity-based policies, such as an IAM role for the Lambda function, without conflicting with the domain access policy. If you wish to explore OpenSearch security in more detail, check out the official documentation available here. Lambda functions setup Before we create the Lambda functions, we need to create an API Gateway that will be used to invoke the functions. Similar to other resources, we create the API Gateway using the RestApi construct. We also attach two resources, demo-data and config, to the API Gateway. Later on, we will attach a POST method to the demo-data resource for writing data to DocumentDB, as well as a GET method for reading data from OpenSearch. Additionally, we will attach a POST method to the config resource, which will be used to configure change streams on the DocumentDB collection. Writing data to DocumentDB cluster To be able to write to the DocumentDB cluster, the writer Lambda function requires access to the cluster’s master secret. So, we create an IAM role for our writer function that contains all the necessary permissions. In the inlinePolicies property, we add a new policy that grants access to the cluster’s secret through the secretsmanager:GetSecretValue action. We also include the managed policy AWSLambdaVPCAccessExecutionRole, which provides all the permissions required for running a Lambda function in a VPC and writing logs to CloudWatch. To create the Lambda function, we utilize the NodejsFunction construct. This construct simplifies the process of creating Lambda functions by automatically transpiling and bundling TypeScript or JavaScript code. Under the hood, it utilizes esbuild. We assign the previously created VPC and security group to the Lambda function using the vpc and securityGroups properties. We configure two environment variables: DOCUMENT_DB_SECRET and DOCUMENT_DB_ENDPOINT. These variables store the ARN of the cluster’s master secret and the endpoint of the cluster, respectively. The Lambda function will utilize these values to establish a connection with the DocumentDB cluster. By default, the DocumentDB cluster uses TLS (Transport Layer Security). To establish a connection with the cluster, we need to verify its certificate using the AWS-provided Certificate Authority (CA) certificate. The file global-bundle.pem contains the AWS CA certificate. To make it available to the Lambda function during runtime, we use the afterBundling command hook, which copies global-bundle.pem to the Lambda deployment package. Finally, we attach the Lambda function to the API Gateway as a POST method of the demo-data resource. To connect to the DocumentDB cluster, we utilize the mongodb package. Within the createMongoClient() function, we first retrieve the master secret from Secrets Manager. Then we use this secret, along with the previously bundled CA certificate, to establish a connection with the cluster. In the handler function, we simply instantiate a MongoClient instance and write the requests’ body to the demo-collection. Enabling change streams To utilize change streams, we need to enable them either for the entire DocumentDB database or for the specified collection. Since our DocumentDB cluster is deployed in a private subnet of the VPC, direct access to it is not possible. To overcome this limitation, we create a Lambda function responsible for configuring change streams on the demo collection. This Lambda function is deployed within the VPC and exposed through API Gateway, enabling invocation from outside the VPC. In a real-world scenario, these configuration tasks would typically be performed either through a script during deployment, such as a CodeBuild job, or manually on the cluster if direct access is available (e.g., via a bastion host or VPN connection). For the purpose of this demo, setting up a Lambda function proves to be the simplest solution. The setup for the configuration Lambda function follows the same steps as the writer function, so we can skip directly to the handler code. In the code, we create the demo-collection collection and execute an admin command to enable change streams on it. Event Source Mapping setup An Event Source Mapping (ESM) is a Lambda resource that reads from an event source and triggers a Lambda function. In this case, we use an ESM to read change streams from the DocumentDB cluster and invoke the sync Lambda function. The ESM will handle the connection to the DocumentDB cluster, read the change stream events, group them into batches, and invoke the sync function. In the sync function, we will simply write the entire document to the OpenSearch domain. To perform its tasks successfully, ESM requires the appropriate permissions both at the networking level and the IAM level. The ESM will “inherit” the security group of the DocumentDB cluster and utilize it when establishing a connection to the cluster. This is precisely why we included a self-referencing inbound rule in the security group of the DocumentDB cluster during the VPC setup. This rule allows the ESM to access the cluster successfully. An ESM relies on the permissions granted by the function’s execution role to read and manage items within the event source. Therefore, in the IAM role of the sync function, we include three statements (ESMNetworkingAccess, ESMDocumentDbAccess, ESMDocumentDbSecretAccess) that grant the necessary permissions required by the ESM. The ESMNetworkingAccess statement provides networking permissions, the ESMDocumentDbAccess statement grants DocumentDB management permissions, and the ESMDocumentDbSecretAccess statement allows the ESM to read the master secret of the cluster. We also include an OpenSearchAccess statement, which is utilized by the sync Lambda function itself. The actions es:ESHttpPost, es:ESHttpPut, and es:ESHttpGet within this statement grant the ability to read and write data to the domain or index defined in the resources field. The sync function is defined in the same way as the writer and config functions, using the NodejsFunction construct. So, we can continue to the ESM definition. In the ESM definition, we specify the sync function in the functionName property, the DocumentDB cluster in the eventSourceArn property, and the cluster’s master secret in the sourceAccessConfigurations property. Within the documentDbEventSourceConfig, we define the database and collection from which we want to read change streams. By specifying the value UpdateLookup in the fullDocument property, we indicate that we want to receive the entire document in the change stream event, rather than just the delta of the change. We initially set the enabled property to false for the ESM. We will enable ESM later on, once we have set up change streams on the demo collection by invoking the config endpoint. If we were to enable ESM immediately, since it is created before invoking the config method, it would detect that change streams are not enabled, and we would need to restart it. To establish a connection with the OpenSearch domain, we use the Client class from the @opensearch-project/opensearch package. The Client class relies on the AwsSigv4Signer to obtain the credentials of the sync Lambda function and sign requests using the AWS SigV4 algorithm. This signing process is necessary because the OpenSearch domain uses IAM for authentication and authorization. In the sync function code, we simply instantiate an OpenSearch client, iterate through the change stream events, and write them to the demo-index index. Reading data from OpenSearch domain To retrieve data from the OpenSearch domain, we create a reader Lambda function and attach it to the API Gateway. The reader function requires the same OpenSearch permissions as the sync function to access the domain. We create an IAM role specifically for the reader function and, similar to the other functions, we include the managed policy AWSLambdaVPCAccessExecutionRole. We create the reader function using the NodejsFunction construct. In the function’s environment, we set the OPEN_SEARCH_DOMAIN_ENDPOINT variable and we attach the function to the GET method of the demo-data resource. In the function’s code, we instantiate the OpenSearch client, query the demo index, and retrieve the data. We include the retrieved data in the body of the function’s response, returning it to the caller. Deploying and testing the synchronization Before deploying the solution, it is necessary to enable the service-linked role for the OpenSearch service. When performing operations through the AWS Console, this service-linked role is automatically created when required. Therefore, if you have previously set up the OpenSearch domain using the AWS Console, you should already have the service-linked role created. However, if it is not available, you can create it using the AWS CLI command shown below. The entire CDK code is organized into four stacks: change-streams-demo-vpc-stack: Contains VPC definition and security groups. change-streams-demo-documentdb-stack: Defines the DocumentDB cluster. change-streams-demo-opensearch-stack: Sets up the OpenSearch domain. change-streams-demo-lambda-stack: Creates the API Gateway and Lambda functions. To deploy the entire solution, you can run the npm command shown below. By default, the command will use the account, region, and credentials from your default AWS profile. After the deployment is completed, you will need to retrieve the URL of the API Gateway. Once you have the URL, the next step is to invoke the config endpoint. This will create the demo collection and enable change streams. After invoking the config endpoint, you need to enable the ESM. You can do this by executing the command below. The ID of the ESM can be found as the value of the esm-id output of the change-streams-demo-lambda-stack stack. Alternatively, you can enable the ESM by opening the sync Lambda function in the AWS console, selecting and enabling ESM from the list of triggers of the function. Now you can start adding data to the DocumentDB cluster by invoking the POST method of the demo-data endpoint. Once the data is added, it will be synchronized to the OpenSearch domain. To retrieve the synchronized data, you can invoke the GET method of the demo-data endpoint. The response from invoking the GET method of the demo-data endpoint should contain the same data that was added through the POST method. You can monitor the execution and logs of the Lambda function using the CloudWatch service. After testing the synchronization, you can delete the resources by invoking the command below. Stateful resources, such as the DocumentDB cluster and OpenSearch domain, are configured with the RemovalPolicy.DESTROY and will be deleted along with the stacks. All created resources are tagged with the Application tag, which has the value change-streams-demo. Once the destroy command completes execution, you can double-check if all resources have been deleted by using the Tag Editor of the AWS Resource Groups service. The Tag Editor allows you to search for resources based on their tags. Any remaining resources can be deleted manually. Conclusion In this post, I have demonstrated how to achieve real-time data synchronization from a DocumentDB cluster to an OpenSearch domain using change streams and a Lambda function. The majority of the heavy lifting is handled by AWS on our behalf. For instance, the Event Source Mapping performs all the complex tasks, such as polling for changes and grouping them into batches, while we simply integrate our Lambda function into the flow. The architecture example presented here can be used to enhance the search performance of an existing DocumentDB cluster by replicating its data into a search-optimized OpenSearch domain. This is just one example of the numerous possibilities that change streams offer. Since they are easily integrated with Lambda functions, we have the flexibility to use them in any way we desire. For instance, we could react to events within the DocumentDB cluster and trigger a Step Function or send notifications to users and more. I hope you found this post useful and interesting. If you have any questions regarding the implementation or encounter any deployment issues, feel free to leave a comment below. I’ll make sure to respond as promptly as possible.

17.04.2024. ·
5 min

Node.js Lambda Package Optimization: Decrease Size and Increase Performance Using ES Modules

This article explains how to optimize Node.js AWS Lambda functions packaged in ES module format. It also shows an example with bundling and AWS CDK, as well as results for gained performance improvement. Node.js has two formats for organizing and packaging the code: CommonJS (CJS) — legacy, slower, larger, and ES modules (ESM) — modern, faster, smaller. CJS is still a default module system, and sometimes the only supported option for some tools. Let’s say you have a Node.js project, but you haven’t bothered with this before. You may now ask yourself — in which format is my code packaged? Let’s look at some JavaScript code examples: In JavaScript, it is clear by just looking into the code. But in TypeScript, you may find yourself writing code in ESM syntax, but using CJS in runtime! This happens if TypeScript compiler is configured to produce CommonJS output format. Compiler settings can be adjusted in tsconfig.json file and we will show how to avoid CJS output with an example later. There are two ways for Node.js to determine package format. The first way is to look up for the nearest package.json file and its type property. We can set it to module if we want to treat all .js files in the project as ES modules. We can also omit type property or put it to commonjs, if we want to have code packaged in CommonJS format. The second way to configure this is using file extensions. Files ending with .mjs (for ES modules) or .cjs (for CommonJS) will override package.json type and force the specified format. Files ending with just .js will inherit chosen package format. ES modules So how exactly can ESM help us improve Lambda performance? ES modules support features like static code analysis and tree shaking, which means it’s possible to optimize code before the runtime. This can help to eliminate dead code and remove not needed dependencies, which reduces the package size. You can benefit from this in terms of cold start latency. Function size impacts the time needed to load the Lambda, so we want to reduce it as much as possible. Lambda functions support ES modules from Node.js 14.x runtime. Example Let’s take one simple TypeScript project as an example, to show what we need to configure to declare a project as an ES module. We will add just couple of dependencies including aws-sdk for DynamoDB, Logger from Lambda Powertools and Lambda type definitions. The type field in package.json defines the package format for Node.js. We are using module value to target ES modules. The module property in tsconfig.json sets the output format for TypeScript compiler. In this case, ES2022 value says that we are compiling our code to one of the versions of ES modules for JavaScript. You can find additional info for compiler settings on https://www.typescriptlang.org/tsconfig. Bundling To simplify deploy and runtime process, you can use a tool called bundler to combine your application code and dependencies into a single JavaScript file. This procedure is used in frontend applications and browsers, but it’s handy for Lambda as well. Bundlers are also able to use previously mentioned ES modules features, which is the reason why they are important part of this optimization. Some of the popular ones are: esbuild, webpack, rollup, etc. AWS CDK If you’re using CDK to create your cloud infrastructure, good news is that built-in NodejsFunction construct uses esbuild under the hood. It also allows you to configure bundler properties, so you can parametrize the process for your needs. With these settings, bundler will prioritize ES module version of dependencies over CommonJS. But not all 3rd party libraries have a support for ES modules, so in those cases we must use their CommonJS version. ➤ What’s important to mention is that if you have an existing CommonJS project, you can keep it as is and still make use of this improvement. The only thing you need to add is mainFields property in CDK bundling section, which will set the format order when resolving a package. This might help you if you have some troubles switching the project completely over to ES modules. Let’s use a simple function that connects to DynamoDB as an example. Its job is just to read a record from a database. We will create two Lambda functions with this same code. One using the CDK example above, and the other one using the same CDK but without ESM bundling properties. It is just to have separate functions in CommonJS and ES modules so it’s easier to compare them. Here is a bundling output during CDK deploy with esbuild: You can see that ESM version of the function has package size reduced by almost 50%! Source maps file (.map) is also smaller now. esbuild provides a page for visualizing the contents of your bundle through several charts, which helps you understand what your package consists of. It is available here: https://esbuild.github.io/analyze. Here is how it looks like for our test functions: In this case, CommonJS package is improved by bundler only by minifying the code, which got it down to 500kb. Packages under @aws-sdk take up more than half of the package. But with using ES module — first approach when bundling, the package size goes down even further. As you can see, there is still some code in CJS format as some dependencies are only available as CommonJS. Performance results Let’s see now how much improvement is made by comparing cold start latency between ES module and CommonJS version of the function. Small load test with up to 10 concurrent users was executed to obtain the metrics. Below are visualized results using CloudWatch Logs Insights. CommonJS ES modules Numbers above are in milliseconds, so in average we reduced cold start duration by 50+ms, or 17%. Bigger difference is for minimum latency, which was shorter for almost 70ms, or 26%. These are not drastic differences, but from my experience with real-world projects — package size can go down like 10x, and cold start latency by even 300–400ms. Conclusion The improvement from using ES modules can be seen even in the simple example above. How much you can lower cold start latency depends on how big your function is and if it needs a lot of dependencies to do its job. But that’s the way it should be, right? For example, for simple functions that just send a message to SQS/SNS and similar, we don’t need dependencies from the rest of the app — like database or Redis client, which might be heavy. And sometimes shared code ends up all over the place. Even if the improvement in your case is not that big, it still might be worth considering using ESM. Just be aware, some tools and frameworks still have bad or no support for ESM. In the end, why would you want to pack and deploy the code you won’t use, anyway? 😄 Author: Marko Jevtović Software Developer @Levi9Serbia

27.03.2024. ·
6 min

Od polaznika do profesionalca: Kursevi za IT prekvalifikaciju

U Srbiji se sve više ljudi odlučuje da se prekvalifikuje u IT sektor, tražeći tako nove prilike za profesionalni razvoj i bolje zaposlenje. Obrazovne institucije i drugi centri za edukaciju nude raznovrsne programe obuke, od programiranja do testiranja softvera, otvarajući vrata zainteresovanima za ulazak u dinamičan svet IT industrije. Škole i kursevi za prekvalifikaciju Kada je reč o izboru pravog kursa ili škole za prekvalifikaciju, potrebno je razmotriti različite aspekte – od programa koji se nude do metoda nastave i ishoda zaposlenja. Među kursevima koji su se pokazali kao bolji u ovom procesu su IT Bootcamp, Code by Comtrade, Quantox Academy, Cubes i SmartInIt. Ove obrazovne institucije nude širok spektar kurseva, prilagođenih kako početnicima tako i onima koji već imaju određeno predznanje. IT Bootcamp IT Bootcamp je poznat po svojim intenzivnim programima koji pokrivaju ključne oblasti IT-a. Polaznici imaju priliku da se upuste u testiranje softvera, gde uče o različitim metodologijama testiranja, korišćenju alata i automatizaciji procesa. Za one zainteresovane za programiranje, IT Bootcamp nudi kurs osnova programiranja uz korišćenje Jave, pružajući čvrstu osnovu za dalji razvoj u ovom programskom jeziku. Program razvoja veb stranica nudi obuku u JavaScriptu, PHP-u i WordPress-u, dok kurs o osnovama veb programiranja sa Pythonom polaznicima omogućava da zakorače u svet programiranja kroz jedan od najtraženijih jezika danas. Kurs agilnog projektnog menadžmenta u IT-u je dizajniran da učesnike upozna sa agilnim metodologijama rada koje su sve prisutnije u savremenim IT kompanijama. Code by Comtrade Code by Comtrade je usmeren na razvoj specifičnih tehničkih veština i nudi širok spektar programa. Od Java i AI Developmenta, preko Front-End i Python Developmenta, do PHP Developmenta i Testinga & QA. Kurs Web Designa omogućava polaznicima da se upoznaju sa osnovama dizajniranja modernih i funkcionalnih veb sajtova. Blockchain Development kurs otvara vrata svetu kriptovaluta i distribuirane tehnologije, dok Android i iOS Development programi polaznicima pružaju znanje potrebno za kreiranje aplikacija za dve najpopularnije mobilne platforme. Pored toga, škola nudi i Microsoft obuke, usmerene na specifične tehnologije i alate koje nudi Microsoft. Quantox Academy Quantox Academy se fokusira na praktičnu primenu znanja i veština. Polaznici mogu izabrati između kurseva koji pokrivaju osnove Front-End programiranja, React, PHP, Java, i Python tehnologije, kao i razvoj za Android i iOS platforme. Programi o WordPressu i UX/UI dizajnu omogućavaju polaznicima da se specijalizuju za kreiranje sadržajnih i estetski privlačnih veb sajtova i aplikacija. Kurs o projektnom menadžmentu i automatskom testiranju pruža uvid u organizaciju projekata i efikasno upravljanje kvalitetom softvera. Cubes Cubes nudi programe koji su usmereni na konkretne tehnologije i platforme. Kursevi pokrivaju JAVA - Spring & Hibernate, Frontend & WordPress, osnove Java programiranja, kao i specijalizovane kurseve za razvoj Android aplikacija i QA. Dodatno, Cubes nudi kurseve PHP - Laravel, JavaScript & React.js, kao i besplatne kurseve osnova HTML-a i CSS-a za one koji tek ulaze u svet veb programiranja. Kroz ove programe, polaznici stiču ne samo teoretsko znanje već i praktične veštine potrebne za rad u IT industriji. SmartInIt SmartInIt svojim polaznicima nudi temeljnu obuku u programiranju i razvoju softvera, sa posebnim naglaskom na praktične veštine. Njihovi programi pokrivaju širok spektar tema – od osnova programiranja, preko naprednijih kurseva u web frontend i backend razvoju, do specijalizovanih programa za manuelno i automatsko testiranje softvera. Kroz interaktivne časove i projekte, polaznici imaju priliku da nauče kako da primene stečeno znanje u stvarnim radnim situacijama, čime se povećava njihova konkurentnost na tržištu rada. Iskustva i uvidi polaznika U svetu IT-ja, priče o prelasku iz jedne karijere u drugu često su inspirativne i puno govore o fleksibilnosti i mogućnostima koje industrija nudi. Takav je slučaj i sa Igorom Dumitraškovićem QA testerom u kompaniji 4Create i Slađanom Stojićem, diplomiranim politikologom, čije iskustvo u učenju i prelasku na IT tržište ilustruje raznolikost puteva koje pojedinci mogu odabrati na svojem profesionalnom putovanju. Igorova odluka da upiše Cubes kako bi postao QA tester bila je inspirisana preporukom njegove sestre, koja je već bila deo IT sektora. "Školu mi je preporučila sestra koja je već imala iskustva u IT-ju i čula je da imaju dobar obrazovni program za QA testere", objašnjava Igor. Ovaj savet je poslušao i prošao i šestomesečni obrazovni program sa četiri časa nedeljno, koji je bio prilagođen osobama bez IT predznanja. "Na početku je bilo mnogo novih informacija za mene, ali s obzirom da je kurs osmišljen za polaznike koji nemaju nikakvo IT predznanje, nije mi bilo teško da pratim nastavu od samog početka", ističe Igor, naglašavajući pristupačnost programa početnicima. Najveći izazov u njegovom školovanju bilo je savladavanje automatskog testiranja, posebno Seleniuma. "Najteže mi je bilo kada smo učili automatsko testiranje, odnosno Selenium, pa sam pored domaćeg koje nam je davao predavač, dodatno gledao tutorijale na YouTube-u i Udemy-u", kaže Igor, ukazujući na značaj samostalnog učenja i dodatnih resursa u savladavanju složenih tema. Nakon završetka škole, Igoru je trebalo oko mesec dana da nađe zaposlenje, a škola mu je, po njegovim rečima, znatno pomogla u postavljanju osnova za dalji profesionalni razvoj. Sa druge strane, Slađanov put bio je nešto drugačiji. Kao diplomirani politikolog, on se odlučio za IT sektor nakon što je, kroz razgovore sa prijateljima, shvatio da IT industrija pruža "dobru atmosferu, dobre prilike i konstantnu mogućnost za unapređenje". Tada je odlučio da upiše Code by Comtrade školu kako bi postao Java programer. Prvi koraci ka novoj karijeri nisu bili laki. Pokušaj samostalnog učenja brzo je naišao na prepreke. "Mislio sam da mogu sam da se nosim sa svime, ali ubrzo sam shvatio da mi nedostaje disciplina. Nisam imao ni dovoljno znanja ni strukture", priznaje Slađan. Ovaj uvid doveo ga je do odluke da se upiše na kurs prekvalifikacije. Početak kursa za Slađana nije bio ništa manje izazovan. S novim informacijama koje su neprestano pristizale, osećao se preplavljeno. "Prva tri meseca bila su najteža. Svaki dan su me ‘bombardovali’ novim informacijama, i bilo je trenutaka kada sam mislio da neću uspeti da sve to povežem", kaže on. Ali, strast prema IT-ju i vizija budućnosti u kojoj je deo te industrije držali su ga motivisanim. "Postoje trenuci kada jednostavno morate da verujete u proces. Iako su informacije na početku izgledale kao ogroman zid, vremenom sam naučio kako da ih složim u koherentnu celinu", dodaje. Nakon što su "kockice počele da se slažu", Slađan je počeo da oseća sve veću sigurnost u svoje znanje i veštine. "Kada sam konačno shvatio kako sve funkcioniše, počeo sam da uživam u učenju. Sada, kada šaljem svoj CV, zaista verujem u to što nudim", ističe on. Slađan gleda na svoje iskustvo kao na ključni korak u svojoj profesionalnoj transformaciji. "Važna stvar koju sam naučio je kako da budem disciplinovan i kako bolje da se nosim sa izazovima. IT prekvalifikacija nije samo promenila moju karijeru, već i mene kao osobu”. Igorov i Slađanov pristup obrazovanju i profesionalnom razvoju u IT sektoru ilustruje važnost fleksibilnosti, samostalnog učenja i mreže podrške. Igorovo iskustvo naglašava značaj specijalizovanih obrazovnih programa i dodatnih resursa za savladavanje tehničkih veština, dok Slađanova priča ukazuje na vrednost promene karijere i upornosti u učenju. Oba puta pokazuju da, bez obzira na početni background, strast prema učenju i prilagodljivost mogu dovesti do uspešne karijere u dinamičnom IT sektoru.

HelloWorld
0
27.02.2024. ·
6 min

Nedostatak kadra u srpskom IT-ju: Video igre prave teolozi i pravnici, a filolozi i istoričari programiraju 

Mada je u gejming industriji taj problem još izraženiji, i celokupno domaće IT tržište “boluje” od nedostatka zaposlenih. Sudeći po oglasima za poslove, u obe ove visokotehnološke sfere nedostaje stručni kadar, pre svega obučen za visoke pozicije, poput seniora programera, menadžera, inženjera…   Prema podacima Republičkog zavoda za statistiku u ovoj u industriji radi više od 100.000 zaposlenih. Takođe, prema podacima Vojvođanskog ICT klastera, danas je 20 odsto svih studenata u Srbiji u nekoj oblasti IT, ali  to nije dovoljno za potrebe tržišta čiji je rast oko 10 odsto godišnje.   Trenutno domaći IT ima dominantno inženjerski obrazovni profil. U njega uplovljavaju najčešće diplomci sa beogradskih fakulteta - FON, ETF i matematičkog, novosadskih - FTN i matematičkog, kragujevačkih - FIN i FTN i niških - elektronskog i mašinskog. Tu su još i RAF, Singidunum i Metropoliten.   Kako obrazovni sistem ne može da isprati vrtoglave promene u svetu visoke tehnologije, kadar u gejmingu i IT industriji sve češće se uvozi iz drugih i neočekivanih oblasti. Kako nam je nedavno rekla Svetlana Mikić, menadžerka za brend i komunikacije u beogradskom Studiju Playstudios Europe, u njihovoj kompaniji video igre prave i glumci, arhitekte, slikari, kuvari, teolozi. Slično, i IT firme sve češće zapošljavaju programere koji su nekada bili filolozi, hemičari, nastavnici, advokati…  Prema rečima Milana Šolaje, direkora Vojvođanskog IKT klastera koji već deceniju organizuje prekvalifikacije iz drugih profesija u IT, ovo tržište ima veliki potencijal i rastuću “žeđ” za talentima.  - Što se tiče radne snage, kako godine prolaze sve je više izražen nedostatak menadžerskih kadrova u IT kompanijama, dakle ljudi koji su specijalizovani za razne oblasti ali sa primenom u IT industriji. Jednostavno, ne postoji mnogo obrazovnih institucija koje školuju takav kadar, niti dovoljan broj takvih studenata (menadžment u IT, marketing u IT, HR u IT i slično) - kaže za Helloworld Šolaja.   - Kada je reč o prekvalifikacijama, mnogo je važnije sa kakvim se odnosom i navikama dolazi, nego sa kojim prethodnim obrazovanjem. Ako kandidat želi da uči i zna da uči, neće imati problem da savlada znanja i veštine koje će mu biti potrebne na radnom mestu u IT-ju. Kada je reč o developerima, programerima, uvek su dobrodošla znanja i veštine vezani za logiku i matematiku, ali to je samo osnova. Spremnost na stalno učenje i usavršavanje je u ovoj branši neophodno i konstantno.  Zamenila školsku katedru za IT kompaniju  Marija Savić, bivši nastavnik engleskog jezika, prevodilac, master filolog-anglista, do pre dve godine radila je u prosveti, a danas je programer. Kao početnik, junior u timu zarađuje više nego posle 15 godina nastavničkog iskustva u školi.   - Drug mi je poslao link za državnu prekvalifikaciju, prijavila sam se, položila testove, i odabrala kurs za full-stack Javu, nemajući pojma ni šta je Java ni šta me čeka. U početku me nije zanimalo da se bavim programiranjem, a odabrala sam taj kurs samo da bih videla da li je tačna tvrdnja da svako može da nauči programiranje. Verovala sam da nemam sklonosti ka tome, divila sam se ljudima koji imaju mozak za tehničke nauke, ali mi je programiranje kao profesija delovalo previše apstraktno i nerazumljivo. Kasnije sam odslušala kurs za full-steck PHP, tako da imam oko dve godine formalno-neformalnog obrazovanja za IT - navodi Marija za HelloWorld.  Zabluda da posao i ogromna plata čekaju nove IT-jevce  Uprkos podatku da tržište vapi za stručnjacima, do prvog Marijinog zaposlenja u IT sektoru, prošli su meseci i čak 147 prijava za posao.  - Mnogi razmatraju programiranje kao profesiju gde ih odmah čekaju sigurno zaposlenje i visoke plate. A za to nema garancije. Zavisi od vaših sposobnosti, znanja, truda, energije, ali i od uslova na tržištu. Najteži deo prelaska u IT bio je pronaći posao, poslodavca koji će zaposliti početnika bez iskustva. Tražila sam ugovor, platu, regulisan staž i osiguranje. Nisam htela da volontiram, niti praksu. Prijavljivala sam se na sve oglase iz čijih sam opisa zadovoljavala bar deo uslova. Od tih 147 prijava, samo je jedna bila uspešna, i to je firma u kojoj i danas radim - priča naša sagovornica.   Prema njenim rečima, upornost, istrajnost, i ogromna psihička snaga, suočavanje s odbijanjem neophodni su da bi se istrajalo.   - Važna je i volja da se uči novo, bez obzira na životno doba. Imam kolegu kom nedostaje nekoliko godina do penzije, a on je odlučio da se prekvalifikuje i oproba u IT-ju i sada radi kao junior sa mnom u timu. Neophodno je pratiti promene i stalno učiti. Trebalo bi da se snalazite na internetu, razlikujete korisne informacije od beskorisnih, da radije sat vremena provedete slušajući neki kurs nego listajući tuđe objave po društvenim mrežama.  Od ranije sam svakako imala sklonosti ka računarima i tehnologiji, znam engleski jezik, komunikacija sa strancima nije mi problem, kao ni pisanje prijava, pisama, mejlova. Čini mi se da prekvalifikacija u IT nije za nekoga ko nema apsolutno nikakvih sklonosti ka radu sa računarima.   Obuka jeste opcija za sticanje znanja, ali nije zamena za fakultet. Postoji razlog zašto se softversko inženjerstvo na fakultetu izučava četiri godine.   Sa diplomom istorije uplovio u svet IT  Istoričar Miloš Subašić, je preko Foruma mladih sa invaliditetom programa UNDP prošao besplatan bootcamp za posao Front end development, gde je učio HTML, CSS, JavaScript i React.js. Zbog nepristupačnosti školskih zgrada osobama sa invaliditetom nije radio kao nastavnik, već sticajem okolnosti bio je duže od decenije zaposlen u kompaniji koja se bavi istraživanjem tržišta i u kojoj je uglavnom posao obavljao  online, od kuće. Kada je tokom pandemije iznenada ostao bez posla, na predlog brata počeo je da uči programiranje.  - Neočekivano sam se snašаo, jer sam verovao da je programiranje najteža stvar na svetu, ali bilo mi je vrlo zanimljivo, brzo sam učio. Već tokom jedne od obuka, nakon devet meseci u potpuno novom svetu, dobio sam prvi posao. Počeo sam na poziciji Junior Front end developer, na projektu koji se radio u Gatsby-u (to je faktički React...). Sada već dve godine radim za klijenta koji ima svoj custom CMS, Python-a, tako da sam zbog te situacije prekomandovan u QA departman. Svideo mi se proizvod na kome radim, aplikacija koja pomaže ljudima koji imaju problem sa spavanjem. Naš projektni tim kvalitetno radi, a i klijent je sjajan prema nama. Zaradom sam više nego zadovoljan.  Uverio sam se da je u IT mnogo veća cena radnog sata nego u drugim industrijama - ističe Miloš.  Preko UNDP Programa prekvalifikacije za IT, koji finansira Ministarstvo za rad, zapošljavanje, boračka i socijalna pitanja, za šest godina je realizovano pet ciklusa prekvalifikacija za IT, u okviru kojih je obučeno oko 2.600 ljudi. Svega dva odsto prijavljenih je odustalo, a gotovo polovina je pronašla posao u IT-ju nakon ove škole. Analiza onlajn IT oglasa koju periodično sprovodi UNDP u saradnji sa Infostudom, pokazuje da se pored seniorskih, mediorskih i juniorskih pozicija, sve češće traže i takozvane prateće IT pozicije kao što su QA testeri, biznis analitičari, analitičari podataka, dizajneri.   Prosečne plate junior sistem administratora je oko 740 evra, za junior projektnog menadžera je oko 850 evra, dok je za poziciju junior mobile developer prosečna plata 980 evra.       

HelloWorld
8
31.01.2024. ·
5 min

Početak karijere u IT-ju: Izazovi tehničkog intervjua i kako ih savladati

Početak karijere u IT-ju: Izazovi tehničkog intervjua i kako ih savladati Započinjanje karijere u IT sektoru često je popločano nizom izazova, a jedan od najvažnijih je svakako tehnički intervju. HelloWorld.rs je nedavno imao priliku da razgovara sa Aleksandrom Markovićem na temu "Istine i zablude o radu u srpskoj IT industriji". Ovaj put, Marković nam pruža uvid u proces pripreme i prolaska kroz tehnički intervju kao neko ko je promenio pet kompanija i prošao osam tehničkih intervjua, a u par situacija je bio i sa druge strane stolice. Priprema za tehnički intervju Priprema je prvi i najvažniji korak ka uspešnom tehničkom intervjuu. Kako Marković objašnjava, "u skladu sa pozicijom za koju kandidat konkuriše, bitno je podsetiti se nekih fundamentalnih stvari”. Ova priprema uključuje ne samo osvežavanje znanja specifičnog za posao za koji se aplicira, već i vežbanje kako koncizno i efikasno preneti to znanje. Marković naglašava da je "vreme uglavnom ograničeno, pa ljudi cene kad se ne skreće mnogo sa teme", ističući važnost fokusa i preciznosti. Tehnološke veštine koje su na ceni Razumevanje koje tehnološke veštine su trenutno na ceni može bitno uticati na ishod intervjua. Marković ističe da su u svetu automatizacije testova "Java i Python sa odgovarajućim bibliotekama poput Seleniuma ili Pytesta, a ponegde i JavaScript" i dalje visoko tražene veštine. Međutim, on takođe podseća da je "najbitnija želja za učenjem", što znači da kandidati ne bi trebalo da se ograničavaju samo na tehnologije sa kojima su već upoznati. "To nije inženjerski pristup", dodaje on, podstičući kandidate da budu otvoreni za nova znanja i iskustva. Značaj formalnog obrazovanja Pitanje formalnog obrazovanja u IT sektoru često izaziva polemike, a Markovićeva perspektiva pruža jedan ugao gledanja kada je reč o ovom pitanju. "To se razlikuje od kompanije do kompanije", kaže on, priznajući da dok neke firme i dalje visoko cene formalno obrazovanje, druge daju prednost praktičnom iskustvu.  “'Kršteni' fakulteti su i dalje na ceni, naročito za pozicije sa višim senioritetom. Međutim, ima i onih slučajeva koji su formalno obrazovanje nadomestili dugogodišnjim radom”, objašnjava Marković. Ovo pokazuje da put ka uspehu u IT sektoru nije jednostran i da postoji više načina da kandidati pokažu svoju vrednost. Vrste tehničkih zadataka Razumevanje koje vrste tehničkih zadataka se mogu očekivati na intervjuu pomaže kandidatima da se adekvatno pripreme. Marković objašnjava da zadaci obično uključuju "kratka pitanja kroz koja se vidi da li kandidat barata onim što je napisao u CV-ju." On naglašava značaj transparentnosti i sposobnosti da kandidat odbrani svoje rešenje, dodajući da je "bitno tretirati intervju kao dvosmernu ulicu", što znači da i kandidat treba da ima priliku da postavlja pitanja regruteru i proceni da li je pozicija adekvatna za njega. Praksa i portfolio projekata Značaj prakse i portfolija projekata ne može se dovoljno naglasiti. "Veoma je važna," kaže Marković, objašnjavajući da kompanije sve više traže dokaze o praktičnom iskustvu kandidata. Savetuje kandidatima da aktivno rade na projektima koji mogu da pokažu njihove veštine i sposobnost za samostalan rad, kao i za rad u timu. Isticanje tokom tehničkog intervjua Kako se istaći tokom tehničkog intervjua? Marković savetuje da je "najbolje da znate sve što vas pitaju, pa i više od toga". Naravno, to dolazi sa razumevanjem i sposobnošću da se znanje jasno prenese.  "Bitno je da čovek ume da objasni i obrazloži to što zna", što implicira duboko razumevanje materije. Učenje iz grešaka Greške na tehničkim intervjuima su neizbežne, ali Marković ih vidi kao prilike za učenje. Deljenjem svojih slabih tačaka i otvorenošću za pitanja, kandidati mogu da pokažu svoju spremnost na učenje i adaptaciju, što je visoko cenjeno u IT sektoru. Suočavanje sa nervozom Nervozu tokom intervjua Marković smatra normalnom. "Nisam nešto bio nervozan, možda malo u početku, ali to vremenom prođe" kaže on, ističući ponovo da je intervju pre svega razgovor, prilika za obostranu ocenu i razmenu informacija. Važnost mekih veština Soft skills, poznate i kao meke veštine, predstavljaju niz ličnih atributa, socijalnih veština, komunikacijskih sposobnosti, i emocionalne inteligencije koje omogućavaju ljudima da se na efikasan način nose sa međuljudskim odnosima, stvaraju pozitivno radno okruženje, i efektivno komuniciraju sa drugima. Za razliku od hard skills, koje su specifične veštine i znanja potrebna za obavljanje određenih tehničkih zadataka ili poslova, soft skills su više povezane sa ličnošću pojedinca i načinom na koji funkcioniše sa drugima u profesionalnom kontekstu. Marković naglašava važnost ovih veština, objašnjavajući da "te veštine kasnije bitne i za odnos prema kolegama u timu i kompaniji". Profesionalizam, način izražavanja, i ponašanje na poslu ključni su za uspešnu karijeru u IT sektoru. Markovićeva iskustva i saveti služe kao dragoceni vodič za sve one koji teže da unaprede svoje karijere u IT sektoru. Kroz njegovu priču, vidimo da je kontinuirano učenje, otvorenost za nove tehnologije, i razvoj mekih veština, poput komunikacije, timskog rada, i emocionalne inteligencije, ono što čini pravog IT profesionalca. On ističe da tehnički intervju treba shvatiti kao priliku ne samo da pokažete svoje znanje, već i da demonstrirate svoje međuljudske veštine, adaptabilnost, i sposobnost za rast i učenje. U suštini, Markovićeva poruka je da, bez obzira na trenutni nivo znanja ili iskustva, strast prema učenju, spremnost na izazove, i razvoj celokupne ličnosti je ono što vodi ka uspehu. S ovim savetima i uvidima, HelloWorld.rs želi da inspiriše i podrži IT profesionalce i one koji teže da to postanu, podstičući ih da grade svoje karijere ne samo na čvrstim temeljima tehničkog znanja, već i na bogatstvu mekih veština koje su jednako važne za ostvarivanje dugoročnog uspeha i zadovoljstva u dinamičnom svetu IT-ja.

HelloWorld
0
25.12.2023. ·
2 min

IT tržište Srbije u prvih devet meseci: Pad potražnje za kandidatima i skok konkurisanja

Broj oglasa za IT pozicije u prvih devet meseci 2023. godine je manji za čak 52% u odnosu na isti period prošle godine, pokazali su najnoviji podaci sajta HelloWorld.rs. Najplaćeniji posao i ove godine u IT sektoru bila je Software inženjer, sa prosečnom platom između 1.807 i 1.985 evra. Istraživanje našeg sajta takođe pokazuje i sve veću potražnju za juniorima kojima je namenjeno čak 15% oglasa za posao, dok je potraga za seniorima konstantna i taj udeo oglasa je 22%. Pad broja oglasa primećen krajem 2022. godine Analizirajući podatke od januara do septembra 2023, uočen je značajan pad od 52% u broju IT oglasa u odnosu na isti period prošle godine. Ovaj trend primećen je u poslednjem kvartalu prethodne godine kada se desio i pad broja oglasa na sajtu. I pored toga, zabeležen je rekordan broj konkurisanja kandidata - u 2023. godini veće je za 55% u odnosu na 2022. Ovaj trend nastavlja se i u trećem kvartalu ove godine. Za Software inženjere nema krize U poslednjih nekoliko godina, IT sektor beleži sve veću potražnju za stručnjacima iz različitih oblasti. Dok se Software inženjeri i dalje nalaze  na ključnoj radnoj poziciji, postoje i drugi visoko traženi poslovi u IT-ju. Na listi najtraženijih su: Software Inženjer IT Help Desk / Support System Administrator / Inženjer Frontend Developer Data Warehouse / Business Intelligence Developer HelloWorld je radio na unapređenju platforme za prikaz informacija o platama, kako bi te podatke učinio preciznijim i relevantnijim za korisnike. Ovaj korak ima za cilj veću sigurnost korisnika sajta u to da prikupljeni podaci odražavaju što realniju sliku o platama u IT sektoru u Srbiji. U saradnji sa Data Science timom smo razradili metodologiju koja će nam omogućiti ovakav pristup. Najplaćeniji su i ove godine Software inženjeri, pored njih se visoko kotiraju i Project menadžeri. Ovako izgledaju prosečni opsezi plata po pozicijama: Software Inženjeri: Prosečna plata se kreće od 1.807 do 1.985 evra. QA Specijalisti: Zarade variraju od 1.047 do 1.245 evra. IT Help Desk: Prosečna plata je između 700 i 790 evra. Test Engineer: Zarade se kreću od 1.106 do 1.365 evra. Project Manager: Prosečna plata iznosi od 1.414 do 1.765 evra. Kada govorimo o najtraženijim tehnologijama u septembru 2023. godine to su: SQL, JavaScript, Cloud, Git i Java. Konstantna potražnja za seniorima i pad broja oglasa za rad od kuće U poređenju sa 2022. godinom, beležimo značajne promene u potražnji kadrova po senioritetu. Konkretno, potražnja za juniorima beleži skok sa 9% na 15%, dok je kod mediora uočen pad sa 68% na 63%. Seniori imaju stabilan udeo oglasa od 22%. U 2023. godini, udeo remote pozicija u ukupnom broju oglasa smanjen je sa 32% na 22%. Ova promena sugeriše prilagođavanje poslovnih modela kompanija, koje sve više naglašavaju potrebu za angažovanjem kadrova koji su fizički prisutni na radnom mestu.  

HelloWorld
0
04.12.2023. ·
4 min

Da li je JavaScript zaista nastao za samo 10 dana?

JavaScript je programski, skriptni jezik koji ne može samostalno da se koristi, već je za njegovo izvršavanje potrebno posebno okruženje, tzv. runtime environment. Najčešće, takvo okruženje je web browser u koji je ugrađen JavaScript kompajler, a sve to zajedno omogućava programerima da dinamički menjaju web sadržaj, bez pozivanja servera, već se sva „magija“ dešava na lokalnom računaru. Postoji i serverska JavaScript platforma Node.js, ali o tome neki drugi put. U 2023. godini, JavaScript  gotovo da nema konkurenciju, jer ga koristi čak 98,6% web sajtova (W3Techs.com). StackOverflow je 2022. godine sproveo anketu među programerima i ispostavilo se da JavaScript koristi više nego bilo koji drugi programski jezik, čak 67,9%  profesionalnih developera. Kada je nešto toliko popularno i uspešno, normalno je da krenu neke glasine i priče od kojih mogu da nastanu i legende, a legenda u ovom slučaju kaže : „JavaScript je nastao za 10 dana!“ Da bismo proverili istinitost ove tvrdnje, moramo da se vratimo u 1995. godinu, april mesec i trenutak kada Netscape angažuje Brendana Ajka i pred njega zaista postavlja rok od 10 dana, kako bi napravio prototip programskog jezika koji se izvršava u Netscape pretraživaču. Važno je napomenuti da su u tom trenutku suštinski postojala samo dva pretraživača - Netscape Navigator i Internet Explorer - koji su se borili za dominaciju na vebu. Svaki od njih je uvodio različite funkcije u pokušaju da pomeri tržišni udeo u svoju korist, te je Ajk predstavljao neku vrstu „tajnog oružja“ u ovom digitalnom ratu. Netscape je, u najvećoj meri, privukao pažnju Microsofta, jer je Netscape smatrao da su web pretraživač i server nova forma operativnog sistema, a ne samo jedna aplikacija. Odgovor Majkrosofta ogledao se u vidu iznenadne promene fokusa na internet, u okviru izdanja OS Windows 95. Rok od famoznih 10 dana I dok su „ljudi u odelima“ smišljali strategiju i naredne korake, kako bi svoje kompanije što bolje pozicionirali pred „internet bum“ koji je očekivao planetu, Ajk je stvarao novi jezik. Iako je imao samo 24 godine, iza sebe je već imao bogato iskustvo u kreiranju novih programskih jezika, jer je još kao student Univerziteta u Ilionisu osmislio jedan „samo za sebe“, kako bi eksperimentisao sa sintaksama. Takođe, kod prethodnog poslodavca, Silicon Graphics, osmislio je programski jezik koji je služio za kreiranje ekstenzija za alatke za nadgledanje mrežnog saobraćaja. Dakle, sam programski jezik za Ajka nije bio nikakav problem, njemu je najveći izazov predstavljao drugi deo zadatka, a to je da novonastali programski jezik „treba da liči na Javu, ali ne sme da joj predstavlja konkurenciju, treba da bude jednostavniji i da mogu da ga koriste i programeri amateri“, nešto slično kao Microsoft Visual Basic. Naravno, najvažnija stvar je bila da može lako da se „ugnezdi“ u Netscape browser. Rok od famoznih 10 dana je, u stvari, bio povezan sa planiranim objavljivanjem verzije Netscape 2.0 Beta. Ono što je Ajk zamislio bilo je to da „ugradi“ napredne funkcije u JavaScript, a da pritom ne koristi jezičku sintaksu, kako bi jezik na prvi pogled izgledao jednostavno i lagano, ali bi iskusni programeri mogli iskoristiti njegovu stvarnu moć. Osnovnu sintaksu je uzeo iz C programskog jezika. Čitav proces se dešavao u periodu od 6. do 15. maja 1995. godine, kada je „svetlost dana“ ugledao, programski jezik, prvobitno nazvan Mocha. Do septembra, naziv jezika promenjen je u LiveScript, da bi konačno u decembru Netscape i Sun Microsystems (njihova je Java) u zajedničkom saopštenju objavili nov naziv koji i danas poznajemo - JavaScript. E, sad, da li je tačna tvrdnja da je JavaScript nastao za 10 dana? Odgovor je i da i ne. Ono što je bila verzija Mocha i ovo što danas imamo, nema veze jedno sa drugim. JavaScript koji danas poznajemo je nastajao godinama, menjao se i prilagođavao vremenu. I sam Ajk je jednom izjavio da je inicijalna Mocha bila daleko od savršenog programskog jezika. U početku je „imala posla“ sa veoma jednostavnim web aplikacijama i to je razvojnom timu i samom Ajku dalo dosta vremena, da, praktično, u hodu i „iza kulisa“ doteruju ovaj projekat i ispravljaju nedostatke. JavaScript kao veliki pobednik u „ratovima pretraživača“ Ovu „bitku“ web browsera iz 1995.godine  Netscape je lagano dobio, ponajviše zahvaljujući Ajku, međutim, Microsoft se nije predavao tako lako. Stvorili su klon i nazvali ga „JScript“, što je dalje navelo Netscape da podnese zahtev da se JavaScript standarizuje u okviru ECMA (European Computer Manufacturers Association). Posle ovog događaja postalo je jasno da je JavaScript veliki pobednik u „ratovima pretraživača“.  Što se Ajka tiče, on je dalje nastavio svoj fantastični karijerni put tako što je 1998. godine, kao jedan od osnivača, osnovao Mozilu, čiji se Firefox pretraživač, praktično, smatra za naslednika Netscape-a. Mozilu je napustio 2014. godine, a nagradno pitanje za kraj bi moglo da bude, šta mislite, koja osoba stoji iza besplatnog i privatnosti korisnika okrenutog pretraživača Brave, koji je u ponudi od 2015. godine?

HelloWorld
3
07.09.2023. ·
7 min

How I made the Spring Boot startup analyser

It's no secret that Spring applications can sometimes freeze at startup. This is especially noticeable as a project develops: the new service starts quickly and shows great responsiveness, then it acquires some serious functionality, and the final distribution package swells by dozens of megabytes. Now, to simply launch that service locally, you have to wait for half a minute, a minute, two... At such moments of waiting, the developer may ponder: why on Earth is it taking so long? What’s going on? Maybe I shouldn't have added that particular library? Hi, my name is Alexey Lapin, and I am a Lead Developer at Luxoft. In this article, I’ll talk about a web application for analysing the startup phase of Spring Boot services, which uses data from the startup actuator endpoint. This tool may help answer the questions above. Foreword I made this application for myself to understand a new Spring module that I hadn't seen before and practice on the front end. I saw various solutions on the internet, but they either did not work or have not been updated for a long time, and I wanted to create an up-to-date auxiliary tool for the Spring Boot functionality. Spring Boot Startup Endpoint Starting with version 2.4, Spring Boot has an ApplicationStartup metric that records events (steps) that occurred during the service startup and an “actuator endpoint” that makes a list of these events. Here's what it looks like: {     "springBootVersion": "2.5.3",     "timeline": {         "startTime": "2021-09-06T13:38:05.049490700Z",         "events": [             {                 "endTime": "2021-09-06T13:38:05.159435400Z",                 "duration": "PT0.0898001S",                 "startTime": "2021-09-06T13:38:05.069635300Z",                 "startupStep": {                     "name": "spring.boot.application.starting",                     "id": 0,                     "tags": [                         {                             "key": "mainApplicationClass",                             "value": "com.github.al.realworld.App"                         }                     ],                     "parentId": null                 }             },             ...             {                 "endTime": "2021-09-06T13:38:06.420231Z",                 "duration": "PT0.0060049S",                 "startTime": "2021-09-06T13:38:06.414226100Z",                 "startupStep": {                     "name": "spring.beans.instantiate",                     "id": 7,                     "tags": [                         {                             "key": "beanName",                             "value": "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory"                         }                     ],                     "parentId": 6                 }             },             ...         ] ….} } A detailed description of all message fields can be found in the Spring Boot Actuator documentation, but I think it’s all in all pretty straightforward. The event has an “id” and a “parentId”, which allows one to have a tree view. There is also a “duration” field, which shows the time spent on the event + the duration of all associated events combined. The “tags” field contains a list of event attributes, such as the name or class of the generated bean. To enable the collection of data on load events, you must pass an instance of the BufferingApplicationStartup class to the setApplicationStartup method of SpringApplication. In this case, a constructor is used that accepts the number of events to record. All events above this limit will be ignored and will not be included in the startup endpoint’s output. @SpringBootApplication public class App {     public static void main(String[] args) {         SpringApplication application = new SpringApplication(App.class);         application.setApplicationStartup(new BufferingApplicationStartup(1000));         application.run(args);     } } By default, this endpoint has a path of /actuator/startup and supports GET methods for receiving events and POST for receiving events and clearing the buffer, so subsequent calls to this endpoint will return an empty list of events Okay, let's go. We will consider the information provided by the startup endpoint as our data for analysis. The analyser web application is a single-page application (SPA) without a back end. It works like magic: you just need to upload the events that occurred during the service startup, and it will visualise them. The uploaded data is neither transferred nor stored anywhere. I chose Typescript as my go-to programming language, as it seemed like a better option for a Java developer compared to Javascript due to its strong typing and object-oriented programming features. I found it very easy to switch from Java to Typescript and quickly write a working code. As my UI framework, I chose Vue.js 3. To be clear, I have nothing against React, Angular and other front-end frameworks, but at that time Vue.js seemed like a good option due to the low entry threshold and excellent preset tools. Then it was time to choose the component library. It needed to be compatible with Vue.js 3 and have components for working with tables. I considered Element Plus, Ionic Vue, and Naive UI, but due to the availability of customisable components for working with tables, I ended up using the PrimeVue library. The application has a navigation bar with Analyser elements (this is the main screen of the application), Usage (user instructions) and a link to the project's GitHub repository. The main page of the application displays a form for entering data, which can be done in three different ways. The first way is to put a link to the deployed Spring Boot service. In this case, an HTTP request will be made to the specified endpoint and the data will be uploaded automatically. This method is applicable for cases when the service is available from the internet or is deployed locally. Note that loading by url may require additional service configuration in terms of CORS headers and Spring Security. The second and third ways are loading a JSON file or its actual content. The deployed application is located at https://alexey-lapin.github.io/spring-boot-startup-analyzer/ For the analyser demo, I used my own Spring Boot service deployed on Heroku. This service implements the back end of the RealWorld project. The desired endpoint can be found at https://realworld-backend-spring.herokuapp.com/actuator/startup. The service is configured to send correct CORS headers to GET requests from the analyser. Once you load the events using one of the specified methods, the data is visualised in a tree structure. Note that all rows that have child items are hidden. To navigate through this tree, you can use the “>” icons to the left of the item ID, or expand/hide all rows simultaneously using the Expand All / Collapse All buttons. If there are many events, it may take some time to render the expansion of all rows. In the table view, all events are displayed at once. All columns, except for Tags, can be sorted. CI + hosting On one of the previous projects, I was involved in the global DevOps transformation of our client and worked on automating the release cycle processes and building CI/CD pipelines. It was an interesting experience, which now helps me to resolve issues related to writing the source code of products. In this case, as with most of my open-source software projects, I used GitHub as my git hosting, as it provides many useful tools for CI, artefact storage, documentation, project management, static site hosting, etc. For the needs of the analyser, I specifically used Actions and Pages. GitHub Actions is configured to run a workflow on events like “pull request”, “commit to master”, and “push a tag”. Pushing a tag will also deploy the assembled project to GitHub Pages, as well as build the Docker image and send it to Docker Hub. In addition to the analyser’s public instance on GitHub Pages, you can use the Nginx-based Docker image. The latter can be useful, for example, for those cases when Spring Boot services are located on the organisation's internal network, from which there is no internet access, but Docker is available and it is possible to load the image. To start the container, run the following command: docker run -d --name sbsa -p 8080:80 lexlapin/spring-boot-startup-analyzer If you need to access this container through a reverse proxy, then pass the path through the environment variable: (UI_PUBLIC_PATH): docker run -d --name sbsa -p 8080:80 -e UI_PUBLIC_PATH=/some-path lexlapin/spring-boot-startup-analyzer Things to improve In the future, I plan to refine the screen with the analysis results. Plus, it would be useful to add a tab with a summary of event types, their number and total elapsed time, such as the number and total time spent to create beans. Another possible feature is building charts on short pivot tables — especially since PrimeVue provides such an opportunity through the Chart.js library. In tree view and table view, colour coding can be done to highlight long events. Additionally, it is worth adding event filtering — for example, by type. Conclusion The proposed analyser allows one to conveniently visualise the data received from the startup actuator endpoint, estimate in detail the time spent on various types of events that occur during the service startup, as well as generally process startup information more efficiently. The application has a public instance on GitHub Actions and is also available as a Docker image. This application was successfully used on one of Luxoft’s projects to analyse the loading of slowed-down services and helped to detect several classes with suboptimal logic in the constructors.

HelloWorld
1
16.06.2023. ·
3 min

WebAssembly - alternativa JavaScript-u

Ukoliko se do sada niste susreli sa WebAssembly-jem definitivno vredi da odvojite malo vremena i proučite šta sve ovaj alat može da ponudi. Ukratko, WebAssembly je nastao 2017. godine sa ciljem da se ponudi alternativa JavaScript-u (koji, iako je među najpopularnijim programskim jezicima, ima veoma izražene mane) prilikom pisanja frontend koda (koda koji se ne izvršava na serverima već na korisnikovoj mašini). Glavna razlika između WebAssembly-a i JavaScript-a je u tome što WebAssembly omogućava izvršavanje koda napisanog u drugim jezicima, kao što su C/C++ ili Rust, dok je JavaScript specifičan jezik za web i već se izvršava u pretraživačima (browser-ima). WebAssembly pruža veću brzinu izvršavanja i sigurnost, dok JavaScript nudi jednostavnost i široku podršku.   Od 2017. godine, kada je i nastao, nastalo je dosta alata koji omogućavaju da se kod pisan u drugim programskim jezicima umesto u običan asemblerski kod - kompajlira u WebAssembly kod, čime postaje dostupan za korišćenje iz pretraživača. Ljudima je, osim ideje da prave nove aplikacije i prevode ih u WebAssembly, palo na pamet da pokušaju da u njega prebace i neke postojeće programe - tako smo čak dobili i verzije nekih od ranije veoma popularnih video igrica koje možemo pokrenuti iz svog pretraživača (kao što su DOOM iz 1993. godine, Fallout 2, SimCity 2000 itd).  Koje su to prednosti koje WebAssembly nudi?  Efikasnost izvršavanja: WebAssembly je dizajniran da se izvršava brže od JavaScripta. Wasm kod se prevodi u binarni format koji se izvršava u virtualnoj mašini pretraživača. Ovaj binarni format je dizajniran da bude efikasan i brz za izvršavanje, omogućavajući optimizacije koje se mogu postići na niskom nivou.  Bliskost mašinskom jeziku: WebAssembly koristi mašinski jezik specifičan za virtualnu mašinu pregledača, što omogućava da se kod izvršava na nižem nivou od JavaScripta. To znači da se kompleksne operacije i algoritmi mogu izvršavati brže jer je pristup hardverskim resursima direktniji.   Kontrola memorije: WebAssembly omogućava programerima precizniju kontrolu nad memorijom u poređenju s JavaScript-om. Ovo je posebno korisno za aplikacije koje zahtevaju rad s velikim količinama podataka ili izvođenje zahtevnih algoritama. Precizna kontrola memorije omogućava efikasnije upravljanje podacima i izbegavanje nepotrebnih alokacija i dealokacija.  Primeri framework-ova koji omogućavaju jednostavan rad sa WebAssembly-jem:  Blazor: Blazor u suštini nudi prevođenje C# u WebAssembly, a kao i sam C# jezik, razvio ga je i održava ga Microsoft. Blazor nudi dvije glavne varijante: Blazor Server i Blazor WebAssembly. Blazor Server koristi SignalR za održavanje veze sa serverom i omogućava dinamičko ažuriranje korisničkog interfejsa, dok Blazor WebAssembly izvršava C# kod direktno u pregledaču, što omogućava offline funkcionalnost i nezavisnost od servera.  Rust sa Yew-om: Yew je Rust-ov frontend framework inspirisan React-om koji omogućava razvoj web aplikacija koristeći Rust jezik. Yew koristi WebAssembly za izvršavanje Rust koda u web pretraživaču. On se ističe po performansama, sigurnosti i Rust-ovoj filozofiji "zero-cost abstractions". Yew koristi virtualni DOM (Document Object Model) za efikasno ažuriranje korisničkog interfejsa samo u delovima koji su se promenili. Takođe nudi mogućnost razvoja po komponentama, rukovanja događajima i rad s asinhronim zahtevima.  U poređenju sa već poznatim JavaScript framework-ovima, Yew i Blazor imaju manji ekosistem, manje su prihvaćeni od strane inženjera i zahtevaju učenje novog jezika (Rust ili C#). Takođe, izvršavanje putem WebAssembly-a može imati neočekivane poteškoće u odnosu na JavaScript, jer mogu zahtevati dosta više koda da bi se neke jednostavne stvari uradile. 

Da ti ništa ne promakne

Ako želiš da ti stvarno ništa ne promakne, prijavi se jer šaljemo newsletter svake dve nedelje.