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š :)

Tag: Node (31 rezultat)
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

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
29.08.2023. ·
2 min

Microsoft Bot Framework: Alat za novo doba digitalne komunikacije

Danas, kada četbotovi polako postaju neizbežan deo svakodnevnog života, kako za potrošače, tako i za preduzeća, Microsoft Bot Framework se izdvaja kao rešenje koje je efikasno i sveobuhvatno, pružajući programerima resurse i podršku u svakoj fazi razvoja četbotova. Razumevanje koncepta Microsoft Bot Framework je kolekcija servisa, alata i SDK-ova koji omogućavaju brz i efikasan razvoj četbotova. Tri glavne komponente Framework-a su: Bot Builder SDK: koji omogućava programerima da koriste C# ili Node.js za izgradnju dijaloga i upravljanje razgovorima. Bot Connector: koji povezuje četbotove sa različitim komunikacionim platformama poput Slacka, Microsoft Teams-a ili Facebook Messenger-a. Bot Service: hostovan na Azure, koji omogućava kontinuiranu integraciju i isporuku, upravljanje resursima i analitiku. Strategija i implementacija Proces razvoja četbotova uključuje planiranje, definisanje ciljeva, razumevanje publike i odabir pravog programskog jezika. Dizajn i razvoj podrazumevaju upotrebu Bot Builder SDK-a za izradu kompleksnih dijaloga, implementaciju LUIS-a (Language Understanding Intelligent Service) za obradu prirodnog jezika, i povezivanje sa određenim kanalima putem Bot Connector-a. Testiranje se vrši uz pomoć Microsoft-ovog emulatora za testiranje četbotova u lokalnom okruženju, kao i mogućnost testiranja na različitim platformama. Razmeštanje je omogućeno kroz Bot Service, koji omogućava brzo i pouzdano razmeštanje četbotova na Azure, uz praćenje i analizu korišćenja. Međutim, iako je Microsoft Bot Framework snažan alat, postoje izazovi kao što su sigurnost i održavanje jezične konzistentnosti. Međutim, njegova fleksibilnost i mogućnost prilagođavanja obećavaju svetlu budućnost za četbotove. Industrije koje profitiraju od četbotova Kupovina i maloprodaja: Četbotovi u ovom sektoru mogu pružiti instant podršku kupcima, voditi ih kroz proces kupovine i čak pružiti personalizovane preporuke. Bankarstvo i finansije: Četbotovi su u mogućnosti da odgovaraju na upite o stanju računa, transakcijama i drugim finansijskim uslugama, smanjujući tako opterećenje službe za korisničku podršku. Zdravstvena zaštita: U zdravstvu, četbotovi mogu pomoći u zakazivanju termina, pružanju informacija o lekovima i savetovanju u vezi sa osnovnim zdravstvenim problemima. Putovanja i turizam: Četbotovi su sposobni da pružaju informacije o destinacijama, smeštaju, letovima, i tako olakšaju planiranje putovanja. Obrazovanje: U oblasti obrazovanja, četbotovi mogu služiti kao učitelji i nastavnici, pružajući učenicima i studentima pomoć u učenju i razumevanju složenih tema. Značaj četbotova je neosporan, a njihova primena širi se preko različitih industrija, čineći ih ključnim alatom u modernom poslovanju. Kroz Microsoft Bot Framework, pristup ovim moćnim alatima je pojednostavljen, omogućavajući organizacijama da iskoriste pun potencijal ove inovativne tehnologije.

HelloWorld
0
13.04.2023. ·
5 min

3 digitalne veštine koje će biti najtraženije u 2023.

Sajber bezbednost, kodiranje i upravljanje podacima su veštine koje kompanije vrednuju poput zlata, a potražnja za njim će u 2023. samo nastaviti da raste. Potražnja za digitalnim veštinama znatno se ubrzala u 2022. godini zahvaljujući sve većem broju kompanija koje su počele da se oslanjaju na tehnologiju kako bi inovirale svoje proizvode i spremile svoje poslovanje za budućnost. Sa druge strane, dostupnost zaposlenih sa ovim veštinama nastavlja da se smanjuje. Uprkos tome što će rizik od recesije pojedine kompanije sprečiti da dalje šire svoje timove kako bi optimizovale svoje poslovanje, efekat tih odluka na zapošljavanje tehnološkog kadra biće relativno mali. Čak i u ekonomski nestabilnim vremenima, tehnologija nastavlja da bude prilično bezbedno mesto. Jedan od sektora koji prosto vape za talentovanim radnicima jeste sajber bezbednost. Broj otvorenih pozicija u ovom sektoru između 2013. i 2022. godine porastao je za 350 odsto, sa jednog miliona na 3.5 miliona. Organizacije koje ne obraćaju pažnju na sajber bezbenost stavljaju sebe u prilično ranjivu poziciju kada su u pitanju sajber napadi i rizikuju gubitak profita i reputacije u očima korisnika. Sa druge strane, vrlo lako je okružiti zaposlene najnovijim firewall tehnologijama i anti-virus softverom, ali tek kada ih kompanije nauče da štite svoje onlajn identitete, mogu da kultivišu jaku kulturu sajber bezbednosti. Davno su prošli dani kada su zaposleni mogli da koriste ime svog ljubimca kao lozinku, uz nekoliko brojeva i karaktera na kraju. Ni najboljli bezbednosni softver ne može da uradi puno ako zaposleni nisu dovoljno edukovani. Velika potražnja za programerima Kodiranje i dalje nastavlja da bude jedna od najtraženijih profesija. Broj oglasa za pozicije data inženjera je u poslednje tri godine porastao za 116%, dok za kompjuterske analitičare taj broj iznosi 72 odsto, uz prilično stabilnu potražnju za developerima koji poseduju C#, C++, Angular, Node, Java, Google Cloud i Azure znanje. Sudeći po podacima koje je objavio hackajob, Java programeri obezbedili su sebi najbolju proporciju ponuda za posao i čine 15.8% svih zaposlenih između 2021. i 2022. godine. Odmah iza su C# developeri (15.3%), DevOps profesionalci (10.8%) i JavaScript programeri (10.6%). U poslednje vreme pojavljuje se i sve veći broj developera koji navode Golang u svojim CV-jevima, ne kao komercijalnu veštinu, već kao nešto što su savladali u svoje slobodno vreme. To može dovesti do određenih promena koje bi Golang mogle da, sa prostog interesovanja, pretvore u ključnu veštinu. Usled velike potražnje, visoke plate, bonusi i deonice su samo neke od stvari koje developeri očekuju pre dolaska u neku kompaniju, a vrlo često se može desiti i da ih odbiju ako im cifre nisu baš po volji usled velike potražnje. Posebno se izdvaja DevOps pozicija zbog centralne uloge koju ima u ubrzavanju puta kompanija do softverske vrednosti, menadžerskih sposobnosti i razumevanja operacija. Savladavanjem modernih procesa isporuke softvera, developeri mogu da pokažu da pružaju dodatnu vrednost i sposobnost da se suoče sa svim poslovnim izazovima koje kompanija može da ima. Novi tip softverskog developera? Kako se razvoj softvera ubrzava, uz sve veći uticaj AI tehnologije na programiranje, uloga softverskog developera se menja. AI menja svet programiranja na isti način na koji su digitron i kompjuter to uradili. Tehnološki napredak polako na sebe preuzima neke od najzamornijih poslova na koje su developeri trošili svoje vreme. Oni sada mogu da posvete više vremena većoj slici i rešavanju kritičnih problema. Brzi rast novih tehnologija neće samo promeniti način na koji ljudi rade, već i veštine potrebne da se napreduje u digitalnoj ekonomiji. Potreba za ljudima koji poseduju ove veštine se širi kroz sektore znatno brže u poređenju sa onima koji poseduju prosečne veštine. Ljudske osobine koje nas odvajaju od mašina, poput empatije i kreativnosti, i dalje ostaju ključne stvari prilikom zapošljavanja, i to je nešto što bi trebalo da se nađe u samom vrhu prioriteta, na samo zaposlenih, već i kompanija koje ih zapošljavaju. Izazovi za vodeće pozicije Ljudi na vodećim pozicijama će takođe imati veoma veliku ulogu u pružanju stabilnosti i rasta kompanije jer izazovi koji se odnose na angažovanje, zadržavanje i edukaciju talenta i dalje nastavljaju da predstavljaju problem za mnoge. Investiranje vremena i resursa u menadžerske veštine predstavlja najvažniju stvar kojoj bi kompanije i zaspoleni trebalo da se posvete. Vođe će biti zadužene za pružanje strukture i resursa za razvijanje novih veština unutar timova i njihovo dalje širenje unutar cele kompanije. Osobe na vodećim pozicijama će sada biti odgovorne za interakciju i osnaženje timova, koji svoj posao sada vrlo često obavljaju na daljinu. Sredine sa visokim nivoom produktivnosti sada pokreće visoka psihološka sigurnost unutar timova, i to će u budućnosti predstavljati jedan od najvećih izazova za sve lidere. Pogotovo jer mnogi od zaposlenih više nisu unutar same kompanije, već na udaljenim pozicijama, a vrlo često i u drugim zemljama i kontinentima. Situacija u Srbiji vs. Situacija na zapadu Zahvaljujući sve većem broju kompanija koje započinju svoje poslovanje, situacija u Srbiji donekle je povoljnija za sve tipove IT stručnjaka, prvenstveno zbog velike potražnje i manje ponude. Ovo možda najbolje oslikavaju i same ponude za posao. Posmatrajući ponude na sajtu HelloWorld, u Srbiji su trenutno najtraženije sledeće pozicije, koje proporcionalno zauzimaju i najveći broj oglasa u ponudi: Software Developer / Programer / Inženjer – 719 otvorenih oglasa (6.7% udeo u ukupnom broju oglasa) Frontend developer – 342 otvorene pozicije (3.20% udeo u ukupnom broju oglasa) IT Help Desk / Support – 341 otvorena pozicija (3.19% udeo u ukupnom broju oglasa) JavaScript Developer – 325 otvorenih pozicija (3% udeo u ukupnom broju oglasa). Sam broj ponuđenih pozicija jasno pokazuje da se IT stručnjaci nalaze u znatno boljoj situaciji nego njihove kolege u drugim zemljama. Ovo se posebno odnosi na medior i senior pozicije, jer se čini da su stručnjaci sa potrebnim znanjem izuzetno deficitarni. Ovakva situacija povoljna je i za sve na juniorskim pozicijama jer se pred njima otvara prilično jasan put i kompanije u nedostatku iskusnih radnika svoju pažnju moraju da znatno više poklanjaju početnicima ne bi li uspeli da ih za nekoliko godina pretvore u kadar koji im je trenutno izuzetno potreban, a sve su šanse da će se ovaj trend nastaviti i u budućnosti. Izuzetno mala ponuda stručnjaka koji razmišljaju o promeni posla dodatno podiže cene na tržištu, što se opet, povoljno odražava na zaposlene na svim pozicijama koji razmišljaju o daljem napretku.

21.09.2022. ·
6 min

Top 10 Visual Studio Code Extensions for 2022

As is well-known, Visual Studio Code (VS Code) is a powerful, lightweight code editor available for free on Windows, macOS, and Linux. It’s one of the most popular code editors coming with a robust set of features out of the box. The capabilities of VS Code can be extended, which in return will enhance your working productivity in many ways.

HelloWorld
0
15.09.2022. ·
4 min

Upoznajte EPAM Srbija, sa Milanom Habijancem

Srbija je relativno nova lokacija na mapi EPAM Systems, jedne od vodećih svetskih softver development kompanija.

HelloWorld
0
04.04.2022. ·
4 min

Iskustva kolega koji su završili Internship program

Stefan Jovanović (Java Developer) - “Odlično iskustvo za nekog ko želi da usavrši svoja znanja, ali i nauči nove stvari u poslovnom okruženju. Tu su i mentori koji pomno prate napredak i daju smernice za dalje usavršavanje i izvan obima prakse.” Aleksandra Đorđević (Frontend Developer) - “Internship program mi je pružio mogućnost da radim na pravom projektu sa ostalim praktikantima, uz stalno praćenje našeg napretka i dobijanja smernica od strane mentora. U toku prakse sam se svakodnevno susretala sa novim pojmovima i problemima, što može da bude frustrirajuće za početnike u svetu programiranja. Međutim, komunikacijom sa ostalim članovima tima i mentorima koji su bili uvek tu da pomognu i usmere ka lakšem pronalaženju rešenja, ovi izazovi nisu predstavljali poteškoću, već priliku da se unaprede znanja i veštine potrebne za dalji rad.” Uroš Aleksandrović (.NET Developer) - “Praksa u Prime Software-u pružala mi je kao odlična odskočna daska u svet profesionalizma. Program mi je pomogao da uz pomoć mentora i odlično dizajniranih projekta svoje teoretsko znanje pretočim u praktično na veoma zanimljiv i produktivan način.” Jelena Cvetković (.NET Developer ) - “Internship program je odlična osnova za dalji napredak u karijeri. Velika prednost ove prakse jeste jedna pozitivna, radna atmosfera kao i odlični mentori od kojih sam naučila mnogo stvari koje su mi i danas primenjive u radu na realnim projektima.” Zdravko Čolić (Flutter Developer) - “Veoma mi je drago što sam imao priliku da budem deo ovog Internship programa, gde sam upoznao sjajne ljude i eksperte koji su mi pomogli da razvijem i unapredim kako sebe tako i svoje znanje. Sama organizacija Internship programa je dobro osmišljena, počeli smo sa nekim osnovnim stvarima a zavrsili smo radom na realnom projektu za samo dva meseca što je stvarno sjajno iskustvo i priprema nas za dalje(posao) veoma dobro.” Nikola Vacić (.NET Developer) - “Praksa je za mene bila zanimljiva jer smo radili 3 projekta, 2 samostalna i jedan timski. Svaki projekat je bio teži od prethodnog, ali izvodljiv uz pomoć mentora koji su nam pomagali. Takođe dobra stvar je i to što smo primenjivali ono što smo naučili u prethodnom projektu na novi projekat." Milan Josifović (Frontend Developer) - “Praksa omogućava spoznaju tehnologija koje možda do sada niste imali priliku da koristite. Rešavanje raznovrsnih problema, timskim radom, praćeni su od strane mentora čiji savet imate na raspolaganju svakog trenutka. Pored prijatne atmosfere u kancelariji, omogućen je i rad od kuće, što je dodatna prednost za ljude iz različitih krajeva. Osim neizostavnog dnevnog sastanka tokom dvomesečne prakse, radno vreme je fleksibilno, koje pruža lakšu organizaciju vašeg vremena. Završena praksa nudi brži pristup ka željenoj poziciji u firmi.” Aleksandar Dojčinović (Frontend Developer) - “Praksu u Prime Software-u sam počeo u novembru 2021. godine, posle uspešnog procesa selekcije koji je trajao oko dve nedelje. Prvi deo prakse za javascript trajao je dve nedelje, i imali smo dvadesetak zadataka iz vanila javascripta, koje smo rešavali, onda pushovali na gitlab, i tražili code review od mentora. Drugi deo prakse je bio za backend, trajao je tri nedelje, i tu smo pravili api server u node.js-u, što je bila potpuno nova stvar za mene, nikad ranije nisam pokušavao da radim ništa sa backend tehnologijama, i ovo iskustvo mi je baš prijalo, ne samo da sam završio projekat na vreme, već sam i mnogo bolje razumeo kako api funkcioniše. Treći i primarni deo prakse gde se radio angular je trajao pet nedelja. Praksa se završila zajedničkom prezentacijom projekta, i objašnjavanjem funkcionalnosti backenda, i prezentacijom funkcionalnosti frontenda. Moj konačni utisak o firmi je 10/10, a o praksi, recimo 12/10! :) Lazar Ristić (Flutter Developer) - “Na praksi mi se najviše dopao finalni projekat na kom smatram da sam najviše naučio kako funkcioniše veliki sistem i razvojni ciklus jednog proizvoda, kao i pristupačnost i dostupnost mentora u svakom trenutku (čak i van radnog vremena). Mislim da je program prakse super odrađen za ljude koji su skroz novi u Flutter tehnologiji.” Milica Milekić (Java Developer) - “Učestvovala sam na praksi u martu 2021. godine. Kao apsolutni početnik, uz mnogo rada i truda, stekla sam dovoljno znanja i veština za 3 meseca, nakon čega sam dobila ponudu za posao u Prime Software i sada sam junior Java developer nakon godinu dana rada. Utisak o praksi je generalno odličan, mentori su veoma posvećeni i uvek spremni da pomognu, projekti na kojima smo radili su bili zanimljivi i samo radno okruženje je prijatno i bez napetosti.” Ognjen Atlagić (Frontend Developer) - “Internship program je odlično osmisljen. U početku se utvrđuje poznavanje osnova programskog jezika sa kojim se radi. Nakon toga se dobija projekat na kojem se uči odabrani framework i na kraju svi praktikanti timskim radom prave aplikaciju, simulirajući realan svakodnevni rad na poslu, u timu, na realnom projektu. Naravno sve ovo uz nadzor mentora koji svojim iskustvom i savetima ubrzavaju proces učenja. Druga faza prakse je rad na realnom projektu / aplikaciji koja se koristi unutar firme. Dobivši posao nakon oba kruga prakse, rekao bih da su ispunili moja očekivanja, možda malo i preko toga. :) Za više informacija o kompaniji, posetite profil Prime Software! 

HelloWorld
0
24.02.2022. ·
3 min

Do frontend and backend have a future together?

Find out how challenging it is to change technologies, what could possibly reconcile frontend and backend and learn how to evolve as a programmer. Pour some coffee, put on some relaxing music and join us for the twelfth episode of The Hüb, where Igor Đurić shares valuable insights that he’s gained working as a Lead Architect at Zühlke Serbia.

HelloWorld
0
Da ti ništa ne promakne

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